1. 程式人生 > >基於HEALTHCHECK的docker-compose順序啟動解決方案

基於HEALTHCHECK的docker-compose順序啟動解決方案

序言:主要是為了解決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服務

至此配置完成