HEALTHCHECK
HEALTHCHECK
指令有两种形式:
HEALTHCHECK [OPTIONS] CMD command
(通过在容器中执行一个命令来检查容器的健康)。HEALTHCHECK NONE
(禁用任何健康检查以此作为基础镜像的)
HEALTHCHECK
指令告诉Docker怎样去检查一个容器是否正常工作。这样可以检测到即使服务器进程仍在运行,但是陷入无限循环并且无法处理新连接的Web服务器的情况。
当容器具有指定的健康检查时,容器除了有正常状态还会有健康状态。这个状态是最初的starting
。当一个检查检查通过了,他会变成health
(无论之前是什么状态)。经过了一系列的失败,他会变成unhealthy
。
在CMD
之前的可选项为:
--interval=DURATION
(默认:30秒)--timeout=DURATION
(默认:30秒)--start-period=DURATION
(默认:0秒)--retries=N
(默认:3)
健康检查会在容器启动后的每隔interval 秒进行。
如果一次检查的时长超过了timeout 秒,那么就被认为是失败了。
在经过retries次健康检查失败之后,容器会被考虑为是unhealthy
的。
start period提供了容器需要初始化引导的时间。在period当中的失败是不会计算在retries当中的。但是如果已经经历过检查成功,那么容器就会被当做引导完毕,以后的失败会被记录到period当中。
只能有一个HEALTHYCHECK
指令在Dockerfile当中,如果你指定了多个HEALTHYCHECK
那么就只有最有一个会生效。
在CMD
指令后的指令可以是shell命令(例如HEALTHCHECK CMD /bin/check-running
)或者exec数组(可以看ENTRYPOINT
指令获取更多信息)。
命令的退出值显示了容器的健康情况。下面是可能的值:
- 0:success-容器是健康的,并且随时可以使用。
- 1:unhealthy-容器暂时不能工作。
- 2:reserved-保留值,不要使用次退出值。
例如,要每过5分钟检查web服务能够在3秒内进行响应。
HEALTHCHECK --interval=5m --timeout=3s \
CMD curl -f http://localhost/ || exit 1
为了方便进行debug,所有的stdout和stderr的输出(UTF-8编码)会被存储在健康状态中,并且可以使用docker inspect
进行查询。这个输出应该是短的(现在只有前4096bytes会被存储)。
当容器的健康状态发生变化了,health_status
会生成新的状态。
HEALTHCHECK
特性在Docker 1.12中被添加。