在docker-compose的配置文件中,通過配置depends_on
, links
, volumes_from
, 以及 network_mode: "service:..."
.可以控制服務(wù)的啟動順序牺六,但是卻不能知道被依賴的服務(wù)是否啟動完畢隘冲,在一個服務(wù)必須要依賴另一個服務(wù)完成的時候德挣,這樣就會有問題。
比如在微服務(wù)需要依賴微服務(wù)配置中心,在配置中心沒有加載完畢的時候瓮钥,微服務(wù)就會出現(xiàn)無法加載配置的錯誤狱意。
這個問題湖苞,官網(wǎng)的文檔上有描述
解決的辦法有以下幾種:
1、足夠的容錯和重試機制详囤,比如連接數(shù)據(jù)庫财骨,在初次連接不上的時候镐作,服務(wù)消費者可以不斷重試,直到連接上位置
2隆箩、docker-compose拆分该贾,分成兩部分部署,將要先啟動的服務(wù)放在一個docker-compose中捌臊,后啟動的服務(wù)放在兩一個docker-compose中杨蛋,啟動兩次,兩者使用同一個網(wǎng)絡(luò)理澎。
3逞力、同步等待,使用
wait-for-it.sh
或者其他shell
腳本將當(dāng)前服務(wù)啟動阻塞糠爬,直到被依賴的服務(wù)加載完畢
wait-for-it
的github地址為:wait-for-it
改寫后的docker-compose如下:
version: "2"
services:
web:
build: .
ports:
- "80:8000"
depends_on:
- "db"
command: ["./wait-for-it.sh", "db:5432", "--", "python", "app.py"]
db:
image: postgres