Compose における起動、停止順の制御
サービスの起動順や停止順は
depends_on 属性を使って制御することができます。
Compose では必ず依存順に応じて、コンテナーの起動または停止を行いますが、この依存順とは depends_on
、links
、volumes_from
、network_mode: "service:..."
によって決定されます。
この仕組みを使いたくなる良い例として、データベースアクセスを必要とするアプリケーションがあります。
docker compose up
によって 2 つのサービスを起動させても、その起動に失敗することがあります。
それはデータベースサービスの起動よりも前にウェブサービスが起動してしまったとしたら、データベースを見つけることができずに SQL ステートメントを取り扱えなくなるからです。
起動順の制御
Compose の起動時には、コンテナーが「準備状態」となるまで Compose が処理を待つことはありません。 実行状態になっただけで Compose は次の処理に進んでしまいます。 たとえばリレーショナルデータベースを利用している場合に、接続要求を取り扱えるような状態になる前にデータベースサービスを起動していないと、問題が発生することになります。
サービスが準備状態であることを検知する方法としては、condition
属性である以下のいずれかのオプションを利用することになります。
service_started
service_healthy
. This specifies that a dependency is expected to be “healthy”, which is defined withhealthcheck
, before starting a dependent service.service_completed_successfully
. This specifies that a dependency is expected to run to successful completion before starting a dependent service.
例
services:
web:
build: .
depends_on:
db:
condition: service_healthy
restart: true
redis:
condition: service_started
redis:
image: redis
db:
image: postgres
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 10s
retries: 5
start_period: 30s
timeout: 10s
Compose はサービス依存の順にサービスを生成します。
つまり db
と redis
は web
よりも前に生成されます。
Compose waits for healthchecks to pass on dependencies marked with service_healthy
. db
is expected to be "healthy" (as indicated by healthcheck
) before web
is created.
restart: true
ensures that if db
is updated or restarted due to an explicit Compose operation, for example docker compose restart
, the web
service is also restarted automatically, ensuring it re-establishes connections or dependencies correctly.
db
サービスに対するヘルスチェックでは pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}'
というコマンドを実行することで、PostgreSQL データベースが準備されたかどうかを確認します。
これは 10 秒ごとに 5 回まで再確認が行われます。
Compose でのサービスの削除もまた、サービス依存の順に行われます。
web
は db
と redis