基於HEALTHCHECK的docker-compose順序啟動解決方案
阿新 • • 發佈:2019-01-02
序言:主要是為了解決docker-compose檔案depends-on順序載入並不會等前一個服務啟動完畢的問題。
官方推薦過wait-for-it.sh方案,那個方案對於dockerfile檔案修改較大,我最終沒有使用,有興趣的可以看一下。
一. 修改dockerfile檔案
1. 在檔案中加入:HEALTHCHECK [options] CMD command
其中:options有三個引數可設定:
(1)interval:間隔(s秒、m分鐘、h小時),從容器執行起來開始計時interval秒(或者分鐘小時)進行第一次健康檢查,隨後每間隔interval秒進行一次健康檢查;還有一種特例請看timeout解析。
(2)timeout:執行command需要時間,比如curl 一個地址,如果超過timeout秒則認為超時是錯誤的狀態,此時每次健康檢查的時間是timeout+interval秒。
(3)retries:連續檢查retries次,如果結果都是失敗狀態,則認為這個容器是unhealth的
CMD關鍵字後面可以跟執行shell指令碼的命令或者exec陣列。CMD後面的命令執行完的返回值代表容器的執行狀況,可能的值:0 health狀態,1 unhealth狀態,2 reserved狀態,這個沒細研究,用的也很少。
注意:在Dockerfile中只能有一個HEALTHCHECK指令。如果您列出多個,則只有最後一個HEALTHCHECK將生效。
2. 示例:
HEALTHCHECK --interval=10s --timeout=5s --retries=24 CMD netstat -anp | grep 8080 && exit 0 || exit 1
作用是:測試8080埠成功返回0(健康),不成功返回1(非健康);10秒檢查一次,命令超時時間為五秒,重試24次
二. 編寫docker-compose檔案
2. 在檔案中加入依賴項的健康檢查:
注:需要docker-compose檔案版本為2.1(太高了用不了,2.1測試可用)
config-service: image: 192.168.18.85:5000/config-service:0.0.1 ports: - "8888:8888" restart: always depends_on: gitlab: condition: service_healthy container_name: config
作用是當gitlab服務檢查為健康時,啟動config-service服務
至此配置完成