从里面停止码头工人的容器

问题描述 投票:13回答:4

我有一个在docker容器内运行的cronjob,它检查所有服务是否按预期运行。如果这个cronjob确定存在问题我想停止docker容器(从内部......)

不幸的是,exit只是停止我的cronjob脚本

docker
4个回答
7
投票

基本上,您需要PID 1退出以停止容器。

我最初认为kill -s SIGKILL 1会工作,但PID 1是受保护的,所以它没有。

正如@Thomasleveil所建议的那样,您可以将trap "exit" SIGINT SIGTERM等代码添加到PID 1脚本中,这意味着当发送kill -s SIGINT 1时进程将退出。我稍微倾向于使用这个方法(直接杀死子进程),因为它为父进程提供了清理的机会,并且父进程应该能够在没有awk的情况下找到子进程的PID。

但是,如果您正在运行多个进程,则应考虑使用supervisord或runit之类的东西。


0
投票

我最近不得不弄清楚这一点。经过很多挫折之后,我得到的是:

在dockerfile中,指定ENTRYPOINT:

ENTRYPOINT ["/entrypoint.sh"]

然后,提供这样的脚本。除了调用您的应用程序之外,它不需要执行任何操作。随意添加其他设置到脚本,但请注意,如果脚本在调用您的应用程序后执行任何操作,它可能会掩盖您的应用程序的返回代码。如果这与您相关,请确保让脚本捕获返回代码并将其作为自己的返回代码传播出去。

注意:请勿使用exec来调用您的应用程序!

结果将是PID 1属于entrypoint.sh,您的应用程序将具有其他一些PID。我的倾向于降落在PID 9或10。

然后,当您需要终止应用程序时,只需确定其PID并调用kill -SIGKILL $PIDpkill -SIGKILL yourapp。您的过程(不是PID 1)将收到信号并立即退出。您的entrypoint.sh会立即退出,因为这是您在流程退出后设计的内容。


-1
投票

我杀了“阻塞进程”,即docker正在运行的主进程;像这样(我在这种情况下,docker正在运行sleep infinity命令用于演示目的)。

ps -afx | grep睡觉| awk'{print $ 1}'| xargs kill -9


-3
投票

我试图杀死进程1但没有成功。

尝试使用shutdown -h now评论@ zero323。它工作正常(抱歉,我不能直接投票,因为它不在答案列表中)。

© www.soinside.com 2019 - 2024. All rights reserved.