1. 程式人生 > >Dockerfile-HEALTHCHECK指令

Dockerfile-HEALTHCHECK指令

Dockerfile中使用HEALTHCHECK的形式有兩種: 

  1、HEALTHCHECK [options] CMD command
  2、HEALTHCHECK NODE 意思是禁止從父映象繼承的HEALTHCHECK生效
下面我們主要介紹第一種形式的應用:
options有三個引數可設定:

  interval:間隔(s秒、m分鐘、h小時),從容器執行起來開始計時interval秒(或者分鐘小時)進行第一次健康檢查,隨後每間隔interval秒進行一次健康檢查;還有一種特例請看timeout解析。

  timeout:執行command需要時間,比如curl 一個地址,如果超過timeout秒則認為超時是錯誤的狀態,此時每次健康檢查的時間是timeout+interval秒。
  retries:連續檢查retries次,如果結果都是失敗狀態,則認為這個容器是unhealth的


CMD關鍵字後面可以跟執行shell指令碼的命令或者exec陣列。CMD後面的命令執行完的返回值代表容器的執行狀況,可能的值:0 health狀態,1 unhealth狀態,2 reserved狀態,這個沒細研究,用的也很少。
注意:在Dockerfile中只能有一個HEALTHCHECK指令。如果您列出多個,則只有最後一個HEALTHCHECK將生效。

下面我們進行幾個測試:
我手裡有一個nginx的映象,我們以它為base映象進行一些簡單的測試,以下是我的Dockerfile和測試指令碼。

 


通過Dockerfile可以預計,容器啟動10s內HEALTCHECK的狀態為starting,10s後為healthy狀態。指令碼是監聽容器的80埠,存在返回0,不存在返回1。

執行1、docker build -t test_nginx:2生成映象
       2、docker run -d test_nginx:2 啟動容器。
  3、通過docker ps檢視HEALTHCHECK的狀態

 

驗證:10s內health狀態為starting,10s後狀態為healthy
下面我們需要進到容器把nginx服務停掉,然後觀察health的狀態,預計變成unhealthy使用時間為30s(關於時間上不好展示,有興趣的話可以自己去做測試)

 

登到容器先確認80埠存在,停掉nginx服務,80埠消失,檢視容器health狀態

 

驗證:關掉nginx服務後,指令碼檢測到80埠不存在,返回1,容器狀態為unhealthy(應該是執行了三次這個指令碼得到結果都是1才確認這個容器是不健康的)

關於上面變成unhealthy狀態使用了30s的時間,認真看的同事可能會發現不應該是timeout+interval秒後變嗎。我的command是執行一個指令碼,很快就能得到結果,不存在timeout的情況,所以我設定timeout的意義並不大。
如果我這樣設定HEALTHCHECK –interval=10s –timeout=3s –retries=3 CMD curl http://192.168.30.5:5000/v2。可能會出現curl這個地址3秒內沒響應則認為失敗,然後再開始interval的時間進行下次檢測。最後顯示unhealthy的狀態應該是39s。這就不做測試了。

下面分享一個指令,通過docker指令得到指定容器id的健康狀態
docker inspect –format ‘{{json .State.Health.Status}}’ 41f1414fab75

 

原文:https://blog.csdn.net/tech_salon/article/details/77255915