我可能有点困惑,但我想做的是让 healthceck 在容器外运行,例如在主机上。我不确定为什么 docker 本身不能对容器进行 curling 来判断它是否健康。
healthcheck:
test: ["CMD-SHELL", "curl -s http://localhost:9200/_cluster/health | grep '\"status\":\"green\"'"]
interval: 10s
retries: 10
start_period: 30s
timeout: 5s
但是盒子上没有 curl,而且我读到添加 curl 永远不是一个好主意;那么,我如何在没有 curl 的情况下在盒子上运行该检查?我可以从 docker 应用程序运行它吗?或者从另一个可以在 docker 中设置该盒子健康状况的容器运行它吗?
简单的答案是,您无法在撰写文件中定义在容器外运行的测试,因此您所要求的是不可能的。
相反,请考虑一下容器运行时其内部有哪些可用的命令。
如果
curl
不可用,也许wget
是,或者如我最近使用的那样pidof
。pidof
可用于识别正在运行的进程的 PID(进程 ID)。如果进程未运行,则服务不健康。我不知道您使用的是哪个 http 守护程序,但下面的示例会查找 nginx 的进程 ID 并报告它是什么。pidof
0
当它找到您正在寻找的进程的 PID 时将返回退出状态,1
当它找不到 PID 时将返回退出状态。不过需要提醒的是,如果您尝试获取可能动态生成的网页或应用程序(PHP、Node、Python、.NET 等)的状态,并且只有代码失败但 nginx 仍在运行,则使用 pidof 检查 nginx 是否正常工作显然不会告诉您您的代码/网站失败了。
pidof
如果按原样使用它不适合你的情况,还有其他选项可能会有所帮助。我不会重新引用它的手册页,所以这里有一个链接: https: //man7.org/linux/man-pages/man1/pidof.1.html如果您只需要知道服务正在运行,而实际上并不依赖于docker健康状态,那么您可以使用Uptime Kuma之类的工具为您检查HTTP端点,但显然这需要您在主机上公开一个HTTP端口,以便Uptime Kuma进行检查——然后您可能需要在Uptime Kuma上进行docker健康检查……然后……开始Inception模式。