“Docker healthcheck报告”;“健康”;总是

“Docker healthcheck报告”;“健康”;总是,docker,dockerfile,docker-container,Docker,Dockerfile,Docker Container,我希望能够在容器变得不健康时报告“不健康”(基于各种条件),因为现在偶数调用只返回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 --interva

我希望能够在容器变得不健康时报告“不健康”(基于各种条件),因为现在偶数调用只返回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
我可以看到超时(由代码引起)和状态Ok。但是,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)"
                }
            ]
        }
    },
任何关于如何将容器报告为不健康的指针吗?

结果表明,重试是解决方案

已更改此处列出的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"]

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

HEALTHCHECK --interval=5s --retries=1 --timeout=500ms CMD curl --fail http://localhost:9080/health || exit 1
如果一次运行检查的时间超过超时时间,则 检查被视为失败

需要进行重试连续的健康检查失败,以确保 容器被认为是不健康的

(参考号:)

默认情况下,docker将尝试重试3次,如果连续三次失败,则认为容器不健康。此时,偶数请求返回状态500,奇数请求返回状态200。当它失败时(在偶数请求上),docker将再次重试,这一次它将是奇数请求,因此它报告容器是健康的


通过将retries设置为1,docker将在第一次尝试失败时报告容器不健康,并等待5秒钟再次尝试healthcheck。

需要一点没有卷曲或任何其他外部内容的魔法:

类似ubuntu的“nc”和在alpine image中使用的busybox“nc”版本之间存在差异

关键是,常规nc等待响应,而这一响应是从busybox到not的

因此,我使用{…}将“printf”和“sleep”封装到一个子shell中,该子shell通过管道传输到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