postgresql の docker image は初期化後に再起動する

https://hub.docker.com/_/postgres/

postgresql の公式 docker イメージは、/docker-entrypoint-initdb.d にファイルを置くことで初期化出来る。

postgresql のイメージは初期化中は unix socket でのみ listen するプロセスが起動する。 これは、初期化途中に接続されても困るからだと思う。 この変更は Issue #440 で導入されている。

初期化処理が終わると、TCP ソケットも listen するサーバーを起動しなおす。

そのため、明示的に TCP ソケットを指定して pg_isready を実行する必要がある。

このため、例えば docker-compose を使う場合、healthcheck は明示的に TCP ソケット経由で行う必要がある。

以下のような形だと、初回の unix socket につなぎにいって ready と判断してしまうので NG。 healthcheck が通った後に DB につながらないという謎状態になり得る。

healthcheck:
  test: ["CMD-SHELL", "pg_isready -U postgres -d mydb"]
  interval: 10s
  timeout: 5s
  retries: 5

以下のように、明示的に TCP socket につなぎに行くと良い。

healthcheck:
  test: ["CMD-SHELL", "pg_isready -U postgres -d mydb -h 127.0.0.1 -p 5432"]
  interval: 10s
  timeout: 5s
  retries: 5

Published: 2025-07-16(Wed) 11:21