如何优雅地关闭在Docker中运行的MongoDB 0.8

15

我通过docker文件中的ENTRYPOINT配置启动mongodb,它能够正常工作。但是,当我执行以下命令时:

docker stop <containerid>

看起来是向进程发送了SIGTERM。这意味着文件未被清除。我该如何优雅地关闭正在运行的Docker容器,以便向Docker内部运行的进程发送正确的信号?

3个回答

12

我不确定是否理解。docker stop <id>会发送SIGTERM信号。这是按设计来的。如果进程没有在超时时间(默认为10秒)内正确关闭,则会发出SIGKILL信号。

目前,我们确实存在一些信号传播问题。这是由于pid命名空间和进程具有pid 1的事实造成的。这应该很快通过新的执行插件得到解决。


我实际上想要停止一个容器的能力,但是我想发送SIGINT而不是SIGTERM。在Docker 0.8中是否可能? - canadadry
我认为我已经找到了一个解决方案。我需要使用supervisord来管理这个进程。 - canadadry
8
你可以执行 docker kill -s INT <id> 命令。 - creack
@creack,我无法理解的是使用docker stop时,SIGTREM信号将发送到哪个进程?假设我正在使用entrypoint.sh脚本启动3个服务。杀死信号将被发送给谁?如果只发送给entrypoint,则其他服务将不正常地停止(这正是我在apache或samba winbindd中遇到的情况)。 - Mohammed Noureldin
@creack,我昨天进行了一些关于这方面的实验,我总是在脚本结尾运行bash会话来阻止入口点以一种让人满意的方式退出 (我不喜欢tail,bash更有意义),但是当使用bash时,我的入口点不能处理任何信号,请你帮我解决一下吗?我在这里创建了一个问题:http://stackoverflow.com/questions/41709975/my-bash-script-doesnt-respond-to-signals-when-opening-new-shell-session?在关闭它们之前针对每个容器手动杀死每个bash进程也不是一个实际的解决方案。 - Mohammed Noureldin
显示剩余2条评论

1
我正在使用docker 0.9版本。当调用docker stop时,将向容器内PID为1的进程发送SIGTERM信号。因此,我们可以使用supervisord、runit等来管理子进程。
问题在于,当我们调用$ service docker stop|restart或主机重启时,Docker不会向所有正在运行的容器发送SIGTERM信号。我正在尝试解决这个问题。

1

使用 Docker 0.9 或更高版本,默认情况下会向容器内运行的第一个进程发送 SigTerm 信号。

但是请注意环境变量文件(Ubuntu 中的 /etc/default/docker 和 CentOS 中的 /etc/sysconfig/docker)应该包含 DOCKER_OPTS=" -r=false "(在 CentOS 中为 other_args=" -r=false"),以停止 Docker 自动重启容器。

例如,我正在使用此配置:DOCKER_OPTS=" -g /mydir/docker -r=false --dns 8.8.4.4 "

如果您想在一个容器内运行多个进程,则应使用 supervisord 作为第一个进程,supervisord 将管理其他进程并将信号传递给它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接