控制 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
的依賴項的健康檢查透過。web
在建立之前,db
應該處於“健康”狀態(如 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
之前移除。