向 docker 容器添加健康检查

adding health check to docker container

我正在尝试向我的 docker 容器添加健康检查,所以在我的 Dockerfile 中我添加了这一行

HEALTHCHECK CMD curl --fail http://localhost:8080/health || exit 1

大致基于本教程:https://howchoo.com/g/zwjhogrkywe/how-to-add-a-health-check-to-your-docker-container。在我的 docker-compose 文件中,我添加了这样的健康检查行:

    healthcheck:
      test: ["CMD", "curl", "--silent", "--fail", "http://localhost:8080/health"]

但是容器总是报告不健康。因此,如果我执行 docker exec -it my-container /bin/bash 并进入容器,然后执行健康请求,我会得到:

    $ curl --fail http://localhost:8080/health
    curl: (22) The requested URL returned error: 411 Length Required

我错过了什么? Nginx 已经安装在容器中,所以我只想让 URL 和 /health 一起工作。

我放弃了在 Dockerfile 中使用 HEALTHCHECK 命令,而是通过添加

来更改 nginx.conf 文件
    location /health {
        access_log off;
        return 200 "healthy\n";
    }

docker-compose.yml保持不变。 这对我来说效果很好。

作为解决方案,您可以使用以下示例 - How to Add a Health Check to Your Docker Container

他们提供的 Dockerfile 有一个小的更正,因为检查健康状态存在问题(也必须在那里安装 curl,但如果您需要任何帮助或有任何问题,请告诉我)。

请参考这个特定的解决方案 -

FROM python:3.6-alpine

COPY . /app

WORKDIR /app

RUN pip install -r requirements.txt
RUN mkdir /data \
    && apk add --no-cache \
        openssl \
        curl \
        dumb-init \
        postgresql-libs \
        ca-certificates

#CMD apt-get install curl

HEALTHCHECK CMD curl -f http://localhost:5000/ || exit 1

CMD ["python", "app.py"]

另一种方法,将正在侦听的端口与健康状态相关联。

netcat 默认安装在 Alpine Linux

  nginx:
    image: nginx:1.17-alpine
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "nc", "-vz", "-w1", "localhost", "80"]
      interval: 1s
      timeout: 1s
      retries: 30

如果端口 80 打开,这将以状态 0 退出。