Docker ComposeでDBを待機してから接続する(healthcheck)
最近久しぶりにRDBMSを使うことになり、Docker Composeで各サービスの環境を整えました。
その際 condition: service_healthy
という機能を知り、調べたところ、これは便利だと感じたので共有します。
参照
以下のページに該当機能に関する記述がありました。
depends_on
depends_on
の依存先に condition: service_healthy
を設定すると、対象サービスの healthcheck
が成功してから起動させられます。
また、condition
には他の条件も指定できます。
service_started
: 通常のdepends_on
の動作service_completed_successfully
: 依存先サービスが終了した後に起動
service_completed_successfully
は何らかの初期化に使えそうですね。
healthcheck
こちらは Dockerfile に存在する HEALTHCHECK
がベースとなっているので、まずはそのドキュメントを参照します。
HEALTHCHECK
とは、文字通りコンテナの死活監視を行うものです。
CMD
以降に記述するコマンドの終了コードにより、ステータスが success
または unhealthy
になります。
また、interval
, timeout
, start-period
, start-interval
, retries
により、ヘルスチェックの実行方法を制御できます。
実際の compose.yml
これらを用いて記述した 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
今後も、コンテナに関して新たな知識を得た際には記事を執筆しようと思います。