我有一个运行自定义php文件或说一个unix shell脚本的docker容器。
如果脚本执行正常,则docker容器应继续运行,但是,如果脚本由于错误或自定义检查而失败;然后我要终止(停止),即将该Docker容器的状态更改为“已退出”。
示例情况1:unix shell脚本定期检查文件系统/ URL上的特定文件或数据。如果找不到该数据/文件,我希望docker容器关闭(退出状态),否则它将继续运行。
示例2:脚本运行并检查其他进程的线程滞留计数。如果卡住的线程数大于5,我希望docker进程关闭(退出状态),否则它将继续运行。
我知道如何从外部关闭容器,在这种情况下,我希望根据满足自定义脚本的失败条件从容器内部触发容器关闭。
你能建议吗?
答案 0 :(得分:0)
每个Docker容器都有一些主进程,无论是作为ENTRYPOINT还是CMD启动的。该过程具有pid 1,并具有相应的权利和责任。容器的生存期恰好是该主要进程的长度:导致容器退出的唯一方法是使pid 1退出。由于pid 1很特殊,因此it may not work to kill 1
。
如果要实现这一点,我将编写一个程序(可能使用C语言),该程序可以执行运行状况检查并运行主进程。如果该过程正常退出,那么主管将等待(2),然后退出自身,从而导致容器退出。如果健康检查失败,主管将杀死(2)其孩子,等待(2),然后退出自己。
我还没有立即意识到此概念的预构建实现。它与supervisord的操作没什么不同,除了主管希望以永不退出的初始化进程运行。
另一种可能性是在应用程序本身中实施运行状况检查。然后,您仅在运行一个进程,如果运行状况检查失败,它将杀死自己(例如,退出(3))。像Kubernetes这样的高级协调器也具有运行状况检查概念,该概念可以与网络请求或在容器内运行的命令绑定(有关Kubernetes的信息,请参见Container probes)。