2015-07-21 87 views
8

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

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

+1

'shutdown -h now'? – zero323

+0

你的容器基于什么形象? – Thomasleveil

+0

这是从Ubuntu的:12.04 –

回答

2

基本上,你需要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用于展示吗? – Thomasleveil

+0

呃,不是吗?是否有错误讯息? cron作业运行的用户是什么? –

+0

我尝试了一个shell脚本,其内容是'kill -s SIGKILL 1' +无限循环/睡眠,并使docker在启动时(以root身份)运行该shell脚本。所以我没有cron,只是一个简单的脚本运行;也许一个过程不能自杀?同样'man 2 kill'似乎表明kill命令拒绝向进程发送信号,如果该进程没有明确定义该特定信号的处理程序的话。 – Thomasleveil

1

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

试试看@ zero323与shutdown -h now的评论。它工作正常(对不起,我不能直接投票,因为它不在答案列表中)。

+0

这是最新的ubuntu镜像中发生的事情: > root @ b968bf313300:/#shutdown -h now 无法连接到总线:没有这样的文件或目录 未能与init守护进程交谈。 它什么也没做。 –

相关问题