HEALTHCHECK

HEALTHCHECK指令有两种形式:

  • HEALTHCHECK [OPTIONS] CMD command(通过在容器内部运行一个命令来检查容器的健康)

  • HEALTHCHECK NONE(关闭任何从基础镜像中继承而来的健康检查(healthcheck)。

HEALTHCHECK指令告诉Docker如何测试一个容器来检查它是否依然在正常工作。这个功能能够在一些场景中使用,例如:一个web服务器陷入了一个无限循环而无法正常处理新的连接,尽管服务器进程依然在运行。

当容器指定了一个健康检查时,除了它自身的正常状态,它还会有一个健康状态。这个状态最初是starting状态。任何时候一个健康检查通过以后,它会变成healthy状态(不论它之前是什么状态)。

在连续多次失败后,它的状态会变为unhealthy

在CMD之前可以使用下面的选项:

  • --interval=DURATION (default: 30s)

  • --timeout=DURATION (default: 30s)

  • --start-period=DURATION (default: 0s)

  • --retries=N(default: 3)

健康检查在容器启动后会首先按照设定的间隔时间(interval)执行,然后在每次检查完成后再次按照设定的间隔时间(interval)运行。

如果单次检查的运行时间超过超时(timeout)秒数,则认为检查失败 。

如果一个容器连续的重复(retries)检查都失败,那么容器会被认为是不健康的(unhealthy)。

启动时间段(Start period)为需要一定时间才能完全启动的容器提供了初始化的时间。在此期间,探测故障将不计入最大重试(retries)次数。但是,如果健康检查在容器启动期间探测成功,则会认为容器已经启动。此时,探测的连续失败将被计入最大重试(retries)次数 。

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

CMD关键字之后的命令既可以是shell命令(例如HEALTHCHECK CMD /bin/check-running)也可以是一个exec数组(与其他Dockerfile命令一样;详情请参阅ENTRYPOINT)。

命令的退出状态码表明了容器的健康状态。可能的值有以下这些:

  • 0::成功(success) - 容器是健康的并且已经准备好被使用。

  • 1:不健康(unhealthy)- 容器没有正常工作。

  • 2:预留的值(reserved)- 暂时不使用这个退出状态码。

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

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

为了有助于诊断失败的探测,命令执行时写入到StdoutStderr中的任何输出文本信息 (UTF-8 编码) 都将存储在健康状况中,并且可以通过docker inspect查询。此类输出应保持简短(当前只能存储4096个字节大小的信息)。

当一个容器的健康状态更改以后,会通过新的状态生成一个health_status事件。

HEALTCHECK特性在Docker1.12版本被添加。

Last updated