如何使用wget而不是curl进行Docker运行状况检查?

Den*_*oer 9 wget docker

Docker healthcheck文档显示了curl:

HEALTHCHECK --interval=5m --timeout=3s \
  CMD curl -f http://localhost/ || exit 1 
Run Code Online (Sandbox Code Playgroud)

我希望wget中的一行等价物在没有返回HTTP 200时退出1.

Den*_*oer 31

以下似乎是等效的:

HEALTHCHECK  --interval=5m --timeout=3s \
  CMD wget --quiet --tries=1 --spider http://localhost/ || exit 1
Run Code Online (Sandbox Code Playgroud)

  • 这是个好问题。Heathcheck 只期望以下内容: 0:成功 - 容器运行状况良好且可以使用 1:不健康 - 容器无法正常工作 2:保留 - 不使用此退出代码。因此,它确保在失败时退出代码为 1。 (7认同)
  • 适合我的阿尔卑斯山. (4认同)
  • 为什么`|| 退出1`?如果 wget 失败,则健康检查无论如何都会失败 (3认同)
  • @Peter:这实际上是在[官方 docker compose 文档](https://docs.docker.com/compose/compose-file/compose-file-v3/#healthcheck) 中作为示例给出的,其原因是上面的OP评论中给出了,但您也可以查看[Dockerfile参考文档](https://docs.docker.com/engine/reference/builder/#healthcheck)以获取更多信息。 (2认同)

int*_*tgr 10

Dennis Hoer 的回答很好,但我更喜欢-nv( --no-verbose) 而不是--quiet,那么如果发生错误,可以从 Docker 获取原因:

HEALTHCHECK --interval=5s --timeout=5s --retries=3 \
    CMD wget -nv -t1 --spider 'http://localhost:8000/' || exit 1
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

  • 很高兴知道,因为它不在帮助页面中。更新了答案以使用 --no-verbose。谢谢。 (2认同)