最近久しぶりにRDBMSを使うことになり、Docker Composeで各サービスの環境を整えました。
その際 condition: service_healthy という機能を知り、調べたところ、これは便利だと感じたので共有します。
以下のページに該当機能に関する記述がありました。
depends_on の依存先に condition: service_healthy を設定すると、対象サービスの healthcheck が成功してから起動させられます。
また、condition には他の条件も指定できます。
service_started: 通常の depends_on の動作service_completed_successfully: 依存先サービスが終了した後に起動service_completed_successfully は何らかの初期化に使えそうですね。
こちらは Dockerfile に存在する HEALTHCHECK がベースとなっているので、まずはそのドキュメントを参照します。
HEALTHCHECK とは、文字通りコンテナの死活監視を行うものです。
CMD 以降に記述するコマンドの終了コードにより、ステータスが success または unhealthy になります。
また、interval, timeout, start-period, start-interval, retries により、ヘルスチェックの実行方法を制御できます。
これらを用いて記述した compose.yml が以下の内容です。
services:
postgres:
image: postgres:15
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_DB=postgres
healthcheck:
test: ["CMD", "pg_isready"]
interval: 10s
timeout: 5s
retries: 5
app:
build: .
depends_on:
postgres:
condition: service_healthy
実行結果はこちら。

しっかり立ち上がってから起動しているのが確認できます。
恥ずかしながら、今まではアプリケーション側のロジックで待機させていたので、知ることができてよかったですw
今後も、コンテナに関して新たな知識を得た際には記事を執筆しようと思います。