繁体   English   中英

Docker Healthcheck始终报告“健康”

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM