我在CloudFoundry中运行docker容器。
几天后,实例崩溃并出现以下错误:
实例变得不健康:exec失败:container_linux.go:348:启动容器进程导致" exec:\" / tmp / lifecycle / healthcheck \":stat / tmp / lifecycle / healthcheck :没有这样的文件或目录"
事实:
问题:
答案 0 :(得分:0)
这项健康检查是什么?
Cloud Foundry平台监控您的应用程序。当它检测到应用程序已经"崩溃时#34;它会为你重启它。我把"崩溃了#34;在引号中,因为这是一个含糊不清的术语。
平台定义"崩溃"作为不再响应平台发送的健康检查的应用程序。有三项健康检查。
第一个是基于pid的运行状况检查,平台监视进程以确保它继续运行。如果进程退出,平台会将其解释为崩溃并重新启动您的应用程序。
第二个是基于端口的运行状况检查。有了这个,平台可确保您的应用程序正在侦听已分配的端口。只要平台可以与该端口建立TCP连接,您的应用就被认为是健康的。
第三个是基于HTTP的运行状况检查。这个实际上会向您的应用程序的端点发送HTTP请求。这必须以成功的HTTP状态代码作出响应,否则您的应用程序将被视为已崩溃。
部署到CF的每个应用都使用第一次运行状况检查。除了第一个健康检查之外,任何绑定了路由的应用程序都将使用第二次或第三次健康检查。
您的应用程序似乎正在使用基于端口的运行状况检查,即#2。
为什么执行此检查?
此检查已完成,因此平台知道您的应用是否正常运行。如果不是,平台将尝试通过重新启动失败的应用程序实例来采取纠正措施。
如果未运行第二次或第三次健康检查,平台只能根据其pid的状态判断应用程序是否正在运行。这留下了很大的错误空间,其中进程可能会挂起但挂起或以其他方式无法实际执行其工作。这些额外的运行状况检查允许平台检测更多故障情况并自动纠正它们。
如何预防?
你真的不想阻止健康检查。您可以将其关闭,但如前所述,可能会使您的应用处于无法正常运行的状态。
如果您确实要将其关闭,请将运行状况检查设置为" process"。这告诉平台只执行上面的pid检查(即#1)。
例如:cf push --health-check-type process
在这种情况下,我建议您与Cloud Foundry运营商联系,了解正在发生的事情。运行状况检查失败的原因似乎与您的应用程序无关。他们应该能够使用平台日志来更好地了解故障。
希望有所帮助!