健康檢查說明

HEALTHCHECK 指令有兩種形式:

HEALTHCHECK [OPTIONS] CMD command (check container health by running a command inside the container)
HEALTHCHECK NONE (disable any healthcheck inherited from the base image)

HEALTHCHECK 指令告訴 Docker 如何測試容器以檢查它是否仍在工作。即使伺服器程序仍在執行,這也可以檢測到陷入無限迴圈且無法處理新連線的 Web 伺服器等情況。

當容器指定了執行狀況檢查時,除了正常狀態外,它還具有執行狀況。此狀態最初開始。每當健康檢查通過時,它就會變得健康(無論以前處於什麼狀態)。經過一定數量的連續失敗後,它變得不健康。

CMD 之前可以出現的選項是:

--interval=DURATION (default: 30s)
--timeout=DURATION (default: 30s)
--retries=N (default: 3)

執行狀況檢查將首先在容器啟動後的間隔秒執行,然後在每次上一次檢查完成後再間隔秒。

如果單次執行的檢查花費的時間超過超時秒數,那麼檢查將被視為失敗。

它需要重試連續的健康檢查失敗才能將容器視為不健康。

Dockerfile 中只能有一條 HEALTHCHECK 指令。如果列出多個,則只有最後一個 HEALTHCHECK 才會生效。

CMD 關鍵字後面的命令可以是 shell 命令(例如 HEALTHCHECK CMD /bin/check-running)或 exec 陣列(與其他 Dockerfile 命令一樣;有關詳細資訊,請參閱例如 ENTRYPOINT)。

命令的退出狀態指示容器的執行狀況。可能的值是:

  • 0: success - 容器健康且隨時可用
  • 1: unhealthy - 容器工作不正常
  • 2: starting - 容器尚未準備好使用,但工作正常

如果當容器已經移出開始狀態時探針返回 2(開始),那麼它將被視為不健康

例如,要檢查每五分鐘左右網路伺服器能夠在三秒鐘內為網站的主頁面提供服務:

HEALTHCHECK --interval=5m --timeout=3s \
  CMD curl -f http://localhost/ || exit 1

為了幫助除錯失敗的探測器,命令在 stdout 或 stderr 上寫入的任何輸出文字(UTF-8 編碼)都將儲存在執行狀況中,並可以使用 docker inspect 進行查詢。此類輸出應保持較短(目前僅儲存前 4096 個位元組)。

當容器的執行狀況更改時,將生成具有新狀態的 health_status 事件。

在 Docker 1.12 中新增了 HEALTHCHECK 功能。