如何使用wget而不是curl进行Docker健康检查?

e7arh2l6  于 5个月前  发布在  Docker
关注(0)|答案(4)|浏览(73)

Docker healthcheck文档显示了curl的情况:

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

字符串
我希望在wget中有一行等价的代码,当HTTP 200没有返回时,它将退出1。

vmjh9lq9

vmjh9lq91#

以下似乎是等价的:

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

字符串
其中:

  • --no-verbose-关闭verbose而不完全安静(使用-q),这意味着错误消息和基本信息仍然会被打印出来。
  • --tries=1-如果未设置,某些wget实现将在未返回HTTP 200响应时无限期重试。
  • --spider-作为一个网络蜘蛛,这意味着它不会下载页面,只是检查它们是否在那里。
  • exit 1-确保失败时退出代码为1。Heathcheck仅要求以下内容:
  • 0:成功-容器运行正常,可供使用
  • 1:不健康-容器无法正常工作
  • 2:保留-不要使用此退出代码

Docker compose示例:

healthcheck:
   test: wget --no-verbose --tries=1 --spider http://localhost || exit 1
   interval: 5m
   timeout: 3s
   retries: 3
   start_period: 2m


https://docs.docker.com/compose/compose-file/compose-file-v3/#healthcheck

8e2ybdfx

8e2ybdfx2#

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

bzzcjhmw

bzzcjhmw3#

我有另一个解决办法:

#!/bin/bash

exec 3<>/dev/tcp/localhost/"$1"

echo -e "GET /path/to/health/endpoint/ HTTP/1.1
host: localhost:$1
" >&3

timeout 1 cat <&3 | grep status | grep UP || exit 1

字符串
在你的compose中使用这个脚本.yaml

healthcheck:
  test: [ 'CMD-SHELL', '/bin/bash -c "/path/to/healthcheck.sh 8081"' ]
  ...


我总结了为什么这在这里工作:
https://github.com/dart-lang/dart-docker/issues/58

f5emj3cl

f5emj3cl4#

如果你想做一个GET请求和打印突出做

wget -qO - http:/localhost/

字符串
它告诉wget完全是-q,并写入标准输出-O -

healthcheck:
  test: wget -qO - localhost || exit 1


请注意,另一种解决方案使用--spider,发出HEAD请求。

相关问题