在 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
所示)。
db
服務的健康檢查使用 pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}'
命令來檢查 PostgreSQL 資料庫是否就緒。該服務每 10 秒重試一次,最多 5 次。
Compose 還按依賴關係順序刪除服務。web
在 db
和 redis
之前刪除。