美文网首页
Dockerfile的HEALTHCHECK命令

Dockerfile的HEALTHCHECK命令

作者: CodingCode | 来源:发表于2021-09-15 19:18 被阅读0次

    HEALTHCHECK命令是用来嵌入在container内部用来标识当前container状态的。
    只有当HEALTHCHECK指定的命令返回正确,docker才认为contaier已经到正常(healthy)状态了,否则docker会认为contianer还在启动(starting)。

    HEALTHCHECK的语法

    HEALTHCHECK [<options>] CMD <cmd>
    

    <options>是可选的。

    例如:

    $ cat Dockerfile
    ...
    HEALTHCHECK --interval=30s --timeout=30s --retries=120 CMD curl --fail http://localhost:8080/heartbeat || exit 1
    ...
    

    这样当启动由此Dockerfile创建的image的container时,docker会把当前container标记为starting, 直到curl --fail http://localhost:8080/heartbeat返回正确的值。

    当然这个例子你必须在container里面自己实现localhost:8080/heartbeat请求服务,docker本身不会提供给这个服务的。

    如果本身container没有提供web服务的,那么可以使用其他的任何检测方法,也可以提供一个脚本文件,让docker执行这个脚本都行,只要命令能够返回0标识heartbeat正常就行。

    在测试这个功能时,有一个意外发现,就是实际验证了docker swarm service在更新container的时候是一个一个更新的,而不是一次性把所有的container全干掉,然后一次性都重启。举例来说:
    如果一个swarm service有三个containers(--replicas=3),当接到类似重启命令(docker service update --force <servicename>)时。

    1. docker会先重启其中一个container。
    2. 等待直到这个container状态已经变成healthy后。
    3. 然后再重启第二个container
    4. 然后再等待直到第二个container状态也已经变成healthy后。
    5. 最后再重启第三个container
    6. 直到第三个container也变成healthy之后,service的重启命令才算完成,命令行退出。

    这样做的目的是可以一定程度上保证zero-downtime,即总是有service的container当前还是在活的提供服务的。

    相关文章

      网友评论

          本文标题:Dockerfile的HEALTHCHECK命令

          本文链接:https://www.haomeiwen.com/subject/rbllgltx.html