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