从里面停止码头工人的容器
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从里面停止码头工人的容器相关的知识,希望对你有一定的参考价值。
我有一个在docker容器内运行的cronjob,它检查所有服务是否按预期运行。如果这个cronjob确定存在问题我想停止docker容器(从内部......)
不幸的是,exit
只是停止我的cronjob脚本
基本上,您需要PID 1退出以停止容器。
我最初认为kill -s SIGKILL 1
会工作,但PID 1是受保护的,所以它没有。
正如@Thomasleveil所建议的那样,您可以将trap "exit" SIGINT SIGTERM
等代码添加到PID 1脚本中,这意味着当发送kill -s SIGINT 1
时进程将退出。我稍微倾向于使用这个方法(直接杀死子进程),因为它为父进程提供了清理的机会,并且父进程应该能够在没有awk的情况下找到子进程的PID。
但是,如果您正在运行多个进程,则应考虑使用supervisord或runit之类的东西。
我最近不得不弄清楚这一点。经过很多挫折之后,我得到的是:
在dockerfile中,指定ENTRYPOINT:
ENTRYPOINT ["/entrypoint.sh"]
然后,提供这样的脚本。除了调用您的应用程序之外,它不需要执行任何操作。随意添加其他设置到脚本,但请注意,如果脚本在调用您的应用程序后执行任何操作,它可能会掩盖您的应用程序的返回代码。如果这与您相关,请确保让脚本捕获返回代码并将其作为自己的返回代码传播出去。
注意:请勿使用exec
来调用您的应用程序!
结果将是PID 1属于entrypoint.sh,您的应用程序将具有其他一些PID。我的倾向于降落在PID 9或10。
然后,当您需要终止应用程序时,只需确定其PID并调用kill -SIGKILL $PID
或pkill -SIGKILL yourapp
。您的过程(不是PID 1)将收到信号并立即退出。您的entrypoint.sh
会立即退出,因为这是您在流程退出后设计的内容。
我杀了“阻塞进程”,即docker正在运行的主进程;像这样(我在这种情况下,docker正在运行sleep infinity命令用于演示目的)。
ps -afx | grep睡觉| awk'{print $ 1}'| xargs kill -9
我试图杀死进程1但没有成功。
尝试使用shutdown -h now
评论@ zero323。它工作正常(抱歉,我不能直接投票,因为它不在答案列表中)。
以上是关于从里面停止码头工人的容器的主要内容,如果未能解决你的问题,请参考以下文章