Docker-compose可以使用depends_on選項(xiàng)控制服務(wù)啟動(dòng)和關(guān)閉的順序。撰寫總是開始和依賴順序,其中依賴性是通過確定停止容器 depends_on,links,volumes_from,和network_mode: "service:..."。
但是,對(duì)于啟動(dòng)而言,Compose不會(huì)等到容器“就緒”(對(duì)于您的特定應(yīng)用程序意味著什么)之后,才等到它運(yùn)行時(shí)。這是有充分的理由的。
等待數(shù)據(jù)庫(例如)準(zhǔn)備就緒的問題實(shí)際上只是分布式系統(tǒng)更大問題的一部分。在生產(chǎn)中,您的數(shù)據(jù)庫可能隨時(shí)不可用或移動(dòng)主機(jī)。您的應(yīng)用程序需要能夠應(yīng)對(duì)這些類型的故障。
要解決此問題,請(qǐng)?jiān)O(shè)計(jì)您的應(yīng)用程序以嘗試在失敗后重新建立與數(shù)據(jù)庫的連接。如果應(yīng)用程序重試連接,則它最終可以連接到數(shù)據(jù)庫。
最好的解決方案是在啟動(dòng)時(shí)以及由于某種原因而斷開連接時(shí)都在應(yīng)用程序代碼中執(zhí)行此檢查。但是,如果不需要此級(jí)別的彈性,則可以使用包裝器腳本解決此問題:
使用諸如wait-for-it, dockerize,sh-compatible wait-for或RelayAndContainers模板之類的工具。這些是小的包裝腳本,您可以在應(yīng)用程序的映像中包括這些腳本,以輪詢給定的主機(jī)和端口,直到它接受TCP連接為止。
例如,使用wait-for-it.sh或wait-for包裝服務(wù)的命令:
version: "2"
services:
web:
build: .
ports:
- "80:8000"
depends_on:
- "db"
command: ["./wait-for-it.sh", "db:5432", "--", "Python", "App.py"]
db:
image: postgres
第一個(gè)解決方案有局限性。例如,它不驗(yàn)證特定服務(wù)何時(shí)真正就緒。如果您向命令添加更多參數(shù),請(qǐng)將該bash shift命令與循環(huán)一起使用,如下例所示。
或者,編寫您自己的包裝器腳本以執(zhí)行更特定于應(yīng)用程序的運(yùn)行狀況檢查。例如,您可能要等到Postgres準(zhǔn)備好接受命令:
#!/bin/sh
# wait-for-postgres.sh
set -e
host="$1"
shift
cmd="$@"
until PGPASSword=$POSTGRES_PASSWORD psql -h "$host" -U "postgres" -c 'q'; do
>&2 echo "Postgres is unavailable - sleeping"
sleep 1
done
>&2 echo "Postgres is up - executing command"
exec $cmd
您可以通過設(shè)置以下內(nèi)容,將其用作上一個(gè)示例中的包裝腳本:
command: ["./wait-for-postgres.sh", "db", "python", "app.py"]
免責(zé)聲明:以上內(nèi)容轉(zhuǎn)載自TMT觀察網(wǎng),所發(fā)內(nèi)容不代表本平臺(tái)立場(chǎng)。