在 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 的依賴項上的健康檢查透過。db 預計在建立 web 之前處於“健康”狀態(如 healthcheck 所示)。

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

Compose 還按依賴關係順序刪除服務。webdbredis 之前刪除。

參考資訊