【问题标题】:How to do a Docker healthcheck with wget instead of curl?如何使用 wget 而不是 curl 进行 Docker 健康检查?
【发布时间】:2017-12-08 22:10:15
【问题描述】:

Docker healthcheck document 为 curl 显示了这个:

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

我想要 wget 中的单行等效项,当未返回 HTTP 200 时将退出 1。

【问题讨论】:

    标签: docker wget


    【解决方案1】:

    以下似乎是等价的:

    HEALTHCHECK  --interval=5m --timeout=3s \
      CMD wget --no-verbose --tries=1 --spider http://localhost/ || exit 1
    

    【讨论】:

    • 已更新。 --tries=1 是必需的,因为非 HTTP 200 将导致 wget 无限期地重试。
    • 我应该澄清一下,我在 alpine 3.6 wget 上看到了重试。我没有看到使用 MacOS wget 重试。
    • 为什么是 || exit 1 ?如果 wget 失败,健康检查无论如何都会失败
    • 这是个好问题。 Heathcheck 只期望以下内容: 0:成功 - 容器健康并可以使用 1:不健康 - 容器无法正常工作 2:保留 - 不要使用此退出代码。所以它确保在失败时退出代码一。
    • 如果 HEALTHCHECK 状态不正常,是否有任何解决方法可以停止 docker 容器。我的意思是,使用 docker 文件,是否可以根据 HEALTHCHECK 状态码停止 docker 容器。
    【解决方案2】:

    Dennis Hoer 的回答很棒,但是我更喜欢-nv (--no-verbose) 而不是--quiet,那么如果出现错误,可以从Docker那里得到原因:

    HEALTHCHECK --interval=5s --timeout=5s --retries=3 \
        CMD wget -nv -t1 --spider 'http://localhost:8000/' || exit 1
    

    Docker 捕获的示例输出:

    % docker inspect $container --format "{{ (index (.State.Health.Log) 0).Output }}"
    Connecting to localhost:8000 (127.0.0.1:8000)
    wget: server returned error: HTTP/1.1 404 Not Found
    

    【讨论】:

    • 这是个好建议,可惜 alpine wget 不支持该标志。
    • @DennisHoer 一直为我工作回到 Alpine 3.9,我尝试运行 docker run -it alpine:3.9 wget -nv -t1 --spider 'http://localhost:8000/'
    • 很高兴知道,因为它不在帮助页面中。更新了使用 --no-verbose 的答案。谢谢。
    猜你喜欢
    • 2022-06-22
    • 2019-08-17
    • 2020-09-19
    • 1970-01-01
    • 2021-04-20
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 2017-08-01
    相关资源
    最近更新 更多