首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Docker healthcheck始终报告“健康”

Docker healthcheck始终报告“健康”
EN

Stack Overflow用户
提问于 2018-03-10 10:54:39
回答 3查看 2.6K关注 0票数 0

我希望能够在容器变得“不健康”时报告“不健康”(基于各种条件),目前我只在偶数调用时返回500,在奇数调用时返回200OK。

我的docker文件如下所示:

代码语言:javascript
复制
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输出:

代码语言:javascript
复制
        "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)"
                }
            ]
        }
    },

有什么建议如何报告容器不健康吗?

EN

回答 3

Stack Overflow用户

发布于 2018-03-10 11:13:23

可以,您可以通过将Dockerfile中的HEALTHCHECK更改为以下内容,允许docker上报容器不健康:

代码语言:javascript
复制
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秒再次尝试健康检查。

票数 1
EN

Stack Overflow用户

发布于 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

票数 1
EN

Stack Overflow用户

发布于 2018-03-10 11:11:06

事实证明--重试是解决方案。

此处列出的已更改Dockerfile:

代码语言:javascript
复制
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"]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49204871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档