【问题标题】:How to log docker healthcheck status in docker logs?如何在 docker 日志中记录 docker 健康检查状态?
【发布时间】:2021-08-25 20:29:51
【问题描述】:

目标

我想通过验证 docker 日志来检查我的 docker 容器是否健康。

要求

我有两个文件,即Dockerfileloop.sh,我已向我的docker 添加了一个健康检查,如下所示:

Dockerfile

FROM alpine
ADD . /
HEALTHCHECK --interval=1s --timeout=30s --retries=3 CMD echo {'health':'healthy'}
CMD ["sh","loop.sh"]

loop.sh

#!/bin/sh

while 1>0;do echo "1"; sleep 2; done;

观察

  • 观察 1

docker logs 只输出integer 1 中提到的loop.sh,但不输出我的 docker 的健康状态。下面附上一张图片-

  • 观察 2

docker ps 命令显示容器是健康的,因此推断我的健康检查正在工作。请在下面找到所附图片-

  • 观察 3

docker inspect 命令还显示了 docker 容器的健康状态。请在下方找到截图-

问题

如何记录此{'health':'healthy'} 健康检查状态,以便在 docker 日志中看到?

【问题讨论】:

    标签: docker logging dockerfile


    【解决方案1】:

    好的,这是超级hacky,我并不为此感到自豪。问题是运行状况检查与您的主进程在不同的进程中运行,因此很难写入主进程'stdout

    但是您可以利用主进程(通常)作为进程#1 运行并写入/proc/1/fd/1,即该进程'stdout。像这样的

    FROM ubuntu
    HEALTHCHECK --interval=1s --timeout=30s --retries=3 CMD echo {'health': 'healthy'} | tee /proc/1/fd/1
    CMD tail -f /dev/null
    

    tail -f /dev/null 只是一个让容器保持运行的虚拟命令。

    【讨论】:

    • 非常感谢,Hans,虽然它很老套,但它让我免于很多麻烦。你绝对应该为此感到自豪。感谢您的精彩回复。
    • 只是出于好奇-Docker 检查在其 JSON 结构中提供了更准确的健康状态(Health.status = health),您是否知道 docker 是否有一个文件存储此状态,以及您可以简单地检索它并将其扔到 proc/1/fd/1 上?
    • 我不这么认为。详细的健康状态只有 Docker 知道,这意味着它保存在容器之外。我不知道有什么方法可以从容器中获取它并将其放入日志中。
    • @HansKilian 您可以在 docker 容器中运行 docker 命令,但您需要为其提供对 /var/run/docker.sock 套接字的访问权限。请参阅此question 的答案
    猜你喜欢
    • 2017-08-01
    • 2021-02-22
    • 1970-01-01
    • 2021-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多