?
本文檔使用 php中文網手冊 發(fā)布
您可以使用depends_on選項來控制服務啟動的順序。撰寫總是依賴順序,其中依賴性是通過確定啟動容器depends_on
,links
,volumes_from
,和network_mode: "service:..."
。
但是,Compose不會等到容器“準備就緒”(無論對于您的特定應用程序而言意味著什么) - 直到它運行為止。這有一個很好的理由。
等待數據庫(例如)準備就緒的問題實際上只是分布式系統(tǒng)的一個更大問題的一個子集。在生產中,您的數據庫可能隨時無法使用或移動主機。您的應用程序需要適應這些類型的故障。
為了處理這個問題,應用程序應該嘗試在失敗后重新建立到數據庫的連接。如果應用程序重試連接,它應該最終能夠連接到數據庫。
最好的解決方案是在你的應用程序代碼中執(zhí)行這個檢查,無論是在啟動時,還是因任何原因丟失連接。但是,如果您不需要此級別的恢復能力,則可以使用包裝腳本解決該問題:
使用一個工具,如等待,dockerize或sh兼容等待。這些小包裝腳本可以包含在應用程序的映像中,并將輪詢給定的主機和端口,直到它接受TCP連接。例如,要使用wait-for-it.sh
或wait-for
包裝服務的命令:version:“2”services:web:build:。端口: - “80:8000”depends_on: - “db”命令:“./wait-for-it.sh”,“db:5432”,“ - ”,“python”,“app.py”db: image:postgres 提示:這種第一種解決方案存在局限性; 例如,它不會驗證特定服務何時準備就緒。如果您為命令添加更多參數,bash shift
帶循環(huán)的命令,如下一個示例所示。
或者,編寫自己的包裝腳本以執(zhí)行更多特定于應用程序的運行狀況檢查。例如,您可能要等到Postgres完全準備好接受命令:#!/ bin / bash#wait-for-postgres.sh set -e host =“$ 1”shift cmd =“$ @”,直到psql -h “$ host”-U“postgres”-c'\ l'; do>&2 echo“Postgres is unavailable - sleeping”sleep 1 done>&2 echo“Postgres正在執(zhí)行 - 執(zhí)行命令”exec $ cmd您可以像上例那樣使用它作為包裝腳本,方法是:command:“./ wait-for-postgres.sh“,”db“,”python“,”app.py“