我希望能够在容器变得“不健康”时报告“不健康”(基于各种条件),目前我只在偶数调用时返回500,在奇数调用时返回200OK。
我的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,我可以看到有超时(由代码引起)和状态Ok。
"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)"
}
]
}
},有什么建议如何报告容器不健康吗?
发布于 2018-03-10 11:13:23
可以,您可以通过将Dockerfile中的HEALTHCHECK更改为以下内容,允许docker上报容器不健康:
HEALTHCHECK --interval=5s --retries=1 --timeout=500ms CMD curl --fail http://localhost:9080/health || exit 1如果单次运行检查的时间超过timeout秒,则认为检查失败。
重试健康检查连续失败后,容器才被认为是不健康的。
(参考:https://docs.docker.com/engine/reference/builder/#healthcheck)
默认情况下,docker会尝试重试3次,当连续3次尝试失败时,则认为容器不健康。目前,在偶数编号的请求上返回状态500,在奇数编号的请求上返回状态200。当它失败时(对于偶数编号的请求),docker将重试一次,这次它将是一个奇数编号的请求,因此它报告容器是健康的。
通过设置重试次数为1,docker会在第一次尝试失败时将容器报告为不健康,并等待5秒再次尝试健康检查。
发布于 2019-07-13 06:49:22
是时候在没有卷曲或任何其他外部东西的情况下来点魔法了:
在高山图片中使用的ubuntu 'nc‘版本和busybox 'nc’版本是有区别的。
重点是常规的nc等待响应,而这个从busybox接缝到不。
正因为如此,我使用{ ... }将'printf‘和'sleep’封装到单个子subshell中,该子subshell位于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
发布于 2018-03-10 11:11:06
事实证明--重试是解决方案。
此处列出的已更改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"]https://stackoverflow.com/questions/49204871
复制相似问题