控制 Compose 中的啟動和關閉順序

您可以透過 depends_on 屬性來控制服務的啟動和關閉順序。Compose 始終按照依賴順序啟動和停止容器,其中依賴關係由 depends_onlinksvolumes_fromnetwork_mode: "service:..." 確定。

例如,如果您的應用程式需要訪問資料庫,並且兩個服務都使用 docker compose up 啟動,則可能會失敗,因為應用程式服務可能在資料庫服務之前啟動,並且找不到能夠處理其 SQL 語句的資料庫。

控制啟動

在啟動時,Compose 不會等到容器“準備好”,只會等到它正在執行。如果您的關係資料庫系統需要啟動自己的服務才能處理傳入連線,這可能會導致問題。

檢測服務就緒狀態的解決方案是使用 condition 屬性和以下選項之一

  • service_started
  • service_healthy。這指定了一個依賴項在啟動依賴服務之前應該“健康”,這由 healthcheck 定義。
  • service_completed_successfully。這指定了一個依賴項在啟動依賴服務之前應該成功完成執行。

示例

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 會等待標記為 service_healthy 的依賴項的健康檢查透過。web 在建立之前,db 應該處於“健康”狀態(如 healthcheck 所示)。

restart: true 確保如果 db 由於顯式 Compose 操作(例如 docker compose restart)而更新或重新啟動,則 web 服務也會自動重新啟動,從而確保它正確地重新建立連線或依賴關係。

db 服務的健康檢查使用 pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB} 命令檢查 PostgreSQL 資料庫是否已準備好。服務每 10 秒重試一次,最多重試 5 次。

Compose 也按照依賴順序移除服務。webdbredis 之前移除。

參考資訊