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

您可以使用 depends_on 屬性來控制服務啟動和關閉的順序。Compose 一律按照依賴順序啟動和停止容器,其中依賴關係由 `depends_on`、`links`、`volumes_from` 和 `network_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 按照依賴順序建立服務。`db` 和 `redis` 在 `web` 之前建立。

Compose 會等待以 `service_healthy` 標記的依賴關係通過健康檢查。預期 `db` 在建立 `web` 之前為「健康」(如 `healthcheck` 所示)。

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

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

Compose 也會按照依賴順序移除服務。`web` 在 `db` 和 `redis` 之前移除。

參考資訊