Compose における起動、停止順の制御

サービスの起動順や停止順は depends_on 属性を使って制御することができます。 Compose では必ず依存順に応じて、コンテナーの起動または停止を行いますが、この依存順とは depends_onlinksvolumes_fromnetwork_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 with healthcheck, 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 はサービス依存の順にサービスを生成します。 つまり dbredisweb よりも前に生成されます。

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 でのサービスの削除もまた、サービス依存の順に行われます。 webdbredis

関連情報