如何在Docker日志中记录Docker健康检查状态?

6

目标

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

要求

我有两个文件,分别是Dockerfileloop.sh,并已将HEALTHCHECK添加到我的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 命令只输出了 loop.sh 中提到的整数 1,但没有输出我的 Docker 的健康状态信息。以下是附加的图像-
Output of docker logs

  • 观察2

docker ps 命令显示容器已经正常运行,因此可以推断我的健康检查正在工作。以下是附加的图像-

Output of Docker ps command

  • 观察3

docker inspect 命令也显示了 Docker 容器的健康状态。以下是截图-
Health status

问题

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

1个回答

11

好的,这种方法非常的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 是一个虚拟命令,它可以保持容器运行。


1
非常感谢你,汉斯。虽然这有点取巧,但它确实让我免去了很多麻烦。你应该为此感到自豪。感谢你的出色回应。 - john mich
只是出于好奇- Docker inspect 在其 JSON 结构中提供了更准确的健康状态(Health.status = healthy),您是否知道是否有一个文件,Docker 存储此状态,并且您可以简单地检索它并将其抛到 proc/1/fd/1 上? - john mich
1
我不这么认为。详细的健康状况只有Docker知道,这意味着它保存在容器外部。我不知道你如何从容器内部获取它并将其放入日志中。 - Hans Kilian
1
@HansKilian 你可以在 Docker 容器内运行 Docker 命令,但需要给它访问 /var/run/docker.sock socket 的权限。请参考此问题的答案。 - Jimmix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接