今回は、自分が経験したDockerまわりのトラブルシューティングについてです。
docker-compose.ymlを編集してdocker-compose up -d
したところ、一度は起動したコンテナがRestartingの状態に変化し、その後ずっとRestartingから変化しなくなる、という症状に見舞われました。つまり、一度は正常に起動しても何らかの原因でコンテナが落ちて、再起動してまた落ちて再起動して・・・を繰り返していることになります。
docker-compose ps
ps
コマンドでコンテナの状態(status)を見てみると、起動直後は「Up」なのですが少ししてから再度ps
で見てみると「Restarting」に変化していて、以降はずっと「Restarting」から変化しません。
結論から言うと、コンテナ自体が悪いわけではなく起動の際にコンテナ内でエラーが起こっている可能性が高いです。よって、その原因が解消できればコンテナは正常に起動するはずです。
version: '3'
services:
postgres:
image: postgres
container_name: postgres_hoge
restart: always
environment:
TZ: "Asia/Tokyo"
POSTGRES_USER: pg_hoge_admin
POSTGRES_PASSWORD: pg_hoge_admin
POSTGRES_DB: pg_hoge
ports:
- 30000:5432
volumes:
- postgres:/var/lib/postgresql/data
- ./postgres/initdb:/docker-entrypoint-initdb.d
pgadmin:
image: dpage/pgadmin4
container_name: pgadmin_hoge
restart: always
ports:
- 30001:80
environment:
PGADMIN_DEFAULT_EMAIL: admin@example.com
PGADMIN_DEFAULT_PASSWORD: admin
volumes:
- pgadmin:/var/lib/pgadmin
depends_on:
- postgres
volumes:
postgres:
pgadmin:
上記のようなdocker-compose.ymlを作成してdocker-compose up -d
したところ、PostgreSQL側のコンテナだけRestartingから抜け出せなくなってしまいました。コンテナのリビルドやイメージの再取得をしてもダメです。ダメです。ダメだってば(/ω\)イヤン
こういう場合は、正常起動しないコンテナのログを参照してみて、何らかのエラーが起きていないかチェックした方がいいです。
というのは、「少なくとも1度は正常起動するコンテナ」なので、イメージやコンテナのビルドそのものには問題がないと考えるのが自然です。そうなると、コンテナが正常起動した直後になんらかのエラーがコンテナ内部で発生していると考えられるため、そのエラーを解消する手がかりがログに残っているはずです。残っているはずなんです。残っているといいなぁ。
docker logs --tail 50 --follow --timestamps postgres_hoge
上記のコマンドを実行すると、指定したコンテナ(上記だとpostgres_hoge
コンテナを指します)のログの最新50件分を表示します。大抵の場合、これくらいの件数だけ直近のログを見てみれば何かしらのエラーログを見つけられるはずです。エラーログが見当たらなければ、もうちょっと出力する件数を増やしてみます。
initdb: error: superuser name "pg_hoge_admin" is disallowed; role names cannot begin with "pg_"
今回は上記のコマンドでログを参照してみると、上記の内容が記録されていました。今回の場合、PostgreSQLを構築する際に「pg_hoge_admin」というユーザーを追加しようとしていますが、頭に「pg_」が付くスキーマはシステムが利用するため予約されており新規に割り当てることはできません。「その名前は使えないぜ!」とエラーになっていたわけです。
これがエラーの根本原因ですが、このエラーはdocker-compose.ymlを編集しない限り解消しません。Dockerはコンテナ起動に失敗してもとりあえずそのままの状態でリスタートするので、コンテナの起動ごとに毎回このエラーが発生し続けます。よって、コンテナの起動に失敗し続け「Restarting」から抜け出せなくなっていた、というわけです。今回の場合はユーザー名を変更し、「pg_」のないユーザー名でユーザー追加を行うことで事なきを得ました。
コンテナが起動しない場合はリビルドやイメージの再取得をしがちですが、上記のようにコンテナそのものではなく中身が問題であるケースもあります。思い込みはキケン、というのが今回身に染みました。疲れた・・・_( _´ω`)_ペショ