[英]Docker healthcheck reporting “healthy” always
我希望能够在容器变得如此时(基于各种条件)报告“不健康”,目前,我只在偶数调用中返回500,而在奇数调用中返回200 OK。
我的docker文件如下所示:
FROM golang:alpine
RUN apk update
RUN apk add curl
RUN mkdir /service
COPY healthcheck.go /service
COPY ./counts /service
EXPOSE 9080
WORKDIR /service
HEALTHCHECK --interval=5s --timeout=500ms CMD curl --fail http://localhost:9080/health || exit 1
CMD ["go", "run", "/service/healthcheck.go"]
使用docker inspect
我可以看到存在超时(由代码引起)和状态确定。 但是,检查中的“ Health.Status”显示
“状态”:“健康”
docker inspect
输出:
"Health": {
"Status": "healthy",
"FailingStreak": 1,
"Log": [
{
"Start": "2018-03-10T02:44:12.48947433Z",
"End": "2018-03-10T02:44:12.99252883Z",
"ExitCode": -1,
"Output": "Health check exceeded timeout (500ms)"
},
{
"Start": "2018-03-10T02:44:18.004402431Z",
"End": "2018-03-10T02:44:18.069316531Z",
"ExitCode": 0,
"Output": " % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\nThis time it has to be healthy 252\n\r100 43 100 43 0 0 43000 0 --:--:-- --:--:-- --:--:-- 43000\nnext253"
},
{
"Start": "2018-03-10T02:44:23.078242333Z",
"End": "2018-03-10T02:44:23.583552633Z",
"ExitCode": -1,
"Output": "Health check exceeded timeout (500ms)"
},
{
"Start": "2018-03-10T02:44:28.593083534Z",
"End": "2018-03-10T02:44:28.665864034Z",
"ExitCode": 0,
"Output": " % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r100 43 100 43 0 0 7166 0 --:--:-- --:--:-- --:--:-- 8600\n\nThis time it has to be healthy 254\nnext255"
},
{
"Start": "2018-03-10T02:44:33.671220836Z",
"End": "2018-03-10T02:44:34.177248436Z",
"ExitCode": -1,
"Output": "Health check exceeded timeout (500ms)"
}
]
}
},
任何指针如何将容器报告为不健康?
是的,您可以通过将HEALTHCHECK
中的Dockerfile
更改为以下内容,来允许HEALTHCHECK
报告容器不健康:
HEALTHCHECK --interval=5s --retries=1 --timeout=500ms CMD curl --fail http://localhost:9080/health || exit 1
如果单次检查花费的时间超过超时秒数,则认为检查失败。
需要重新尝试连续进行的健康检查失败,才能将容器视为不健康。
(参考: https : //docs.docker.com/engine/reference/builder/#healthcheck )
默认情况下,docker将尝试重试3次,当它连续3次失败时,则认为该容器不健康。 目前,您在偶数请求上返回状态500,而在奇数请求上返回状态200。 当它失败时(针对偶数请求),docker将再次重试,这一次将是一个奇数请求,因此它将容器报告为正常。
通过将重试设置为1,当第一次尝试失败时,泊坞窗将报告容器为不健康容器,并等待5秒以再次尝试运行状况检查。
原来--retries是解决方案。
更改的Dockerfile列在此处:
FROM golang:alpine
RUN apk update
RUN apk add curl
RUN mkdir /service
COPY healthcheck.go /service
COPY ./counts /service
EXPOSE 9080
WORKDIR /service
HEALTHCHECK --interval=5s --timeout=500ms --retries=1 CMD curl --fail http://localhost:9080/health || exit 1
CMD ["go", "run", "/service/healthcheck.go"]
是时候使用一些魔术而不卷曲或其他外部物品:
高山图片中使用的ubuntu(例如“ nc”)和busybox(nc)版本之间存在差异。
关键是常规nc等待响应,而从busybox接缝的响应则不响应。
因此,我使用{...}将'printf'和'sleep'封装到单个子外壳中,该子外壳通过nc传递给管道。
这样,nc有机会获得来自端点的响应并将其通过管道传递给grep。
grep的退出状态决定健康状态。
HEALTHCHECK --interval=1s --timeout=5s --retries=3 \\ CMD { printf "GET /fpm-ping HTTP/1.0\\r\\n\\r\\n"; sleep 0.5; } | nc -w 1 127.0.0.1 8080 | grep pong
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.