HEALTHCHECK

指令

HEALTHCHECK指令有两种形式:

通过在容器内部运行命令来检查容器的运行状况
HEALTHCHECK [OPTIONS] CMD command 
禁用从基本映像继承的任何运行状况检查
HEALTHCHECK NONE 

描述

HEALTHCHECK 指令告诉 Docker 如何测试容器以检查其是否仍在工作。这样可以检测到诸如Web服务器陷入无限循环并且无法处理新连接的情况,即使服务器进程仍在运行。

HEALTHCHECK 指令是告诉 Docker 应该如何进行判断容器的状态是否正常,这是 Docker 1.12 引入的新指令。

在没有 HEALTHCHECK 指令前,Docker 引擎只可以通过容器内主进程是否退出来判断容器是否状态异常。很多情况下这没问题,但是如果程序进入死锁状态,或者死循环状态,应用进程并不退出,但是该容器已经无法提供服务了。在 1.12 以前,Docker 不会检测到容器的这种状态,从而不会重新调度,导致可能会有部分容器已经无法提供服务了却还在接受用户请求。

而自 1.12 之后,Docker 提供了 HEALTHCHECK 指令,通过该指令指定一行命令,用这行命令来判断容器主进程的服务状态是否还正常,从而比较真实的反应容器实际状态。

指定容器的运行状况检查后,除了其正常状态外,它还具有运行状况。此状态最初为starting。只要运行状况检查通过,它将变为healthy(无论以前处于任何状态)。在一定数量的连续失败之后,它变为unhealthy。 之前可能出现的选项CMD是:

--interval=DURATION(默认值:30s)
--timeout=DURATION(默认值:30s)
--start-period=DURATION(默认值:0s)
--retries=N(默认值:3)

运行状况检查将首先在容器启动后的间隔秒数内运行,然后在每次之前的检查完成后的间隔秒数内运行。

如果单次检查花费的时间超过超时秒数,则认为检查失败。

对于要考虑的容器,需要重试连续进行的运行状况检查失败unhealthy。

开始时间段为需要时间进行引导的容器提供了初始化时间。在此期间的探针故障将不计入最大重试次数。但是,如果运行状况检查在启动期间成功,则认为该容器已启动,并且所有连续失败将计入最大重试次数。

HEALTHCHECK 在 Dockerfile中只能有一条指令。如果您列出多个,则只有最后一个HEALTHCHECK才会生效。

CMD关键字之后的命令可以是shell命令(例如HEALTHCHECK CMD /bin/check-running)或exec数组。

该命令的退出状态指示容器的健康状态。可能的值为:

0:成功-容器健康且可以使用
1:不健康-容器无法正常工作
2:保留-请勿使用此退出代码

例如,要每五分钟检查一次,以便网络服务器能够在三秒钟内为站点的主页提供服务:

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

为了帮助调试失败的探针,命令在stdout或stderr上写入的任何输出文本(UTF-8编码)将存储在运行状况中,并可以通过查询 docker inspect。此类输出应保持简短(当前仅存储前4096个字节)。

当容器的健康状态发生变化时,将health_status生成具有新状态的事件。