如何正常关闭在docker中运行的服务器

时间:2014-02-18 19:06:51

标签: docker

我通过docker文件中的ENTRYPOINT配置启动mongodb。 它工作正常。但是,当我执行:

docker stop <containerid>

似乎是在向流程发送SIGTERM。这意味着mongod.lock文件未被清除。如何正常关闭正在运行的docker容器,以便将正确的信号发送到docker中运行的进程?

3 个答案:

答案 0 :(得分:11)

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

目前,我们确实遇到了信号传播的问题。这是由于pid命名空间和进程有一个pid 1的事实。这应该很快就会被新的执行插件修复。

答案 1 :(得分:1)

我使用的是docker 0.9。当调用 docker stop 时,SIGTERM将被发送到容器内PID = 1的进程。因此,我们可以使用supervisord,runit来管理子流程。

问题是当我们调用 $ service docker stop | restart 或主机重置时。 Docker不会将SIGTERM发送到所有正在运行的容器。我试图解决这个问题。

答案 2 :(得分:1)

使用Docker 0.9或更高版本,它会默认将SigTerm发送到第一个进程(在容器内运行)。

但请注意环境变量文件(Ubuntu中的/ etc / default / docker和CentOS中的/ etc / sysconfig / docker)应该包含 DOCKER_OPTS =&#34; -r = false&#34; (或CentOS中的 other_args =&#34; -r = false&#34; )用于从autorestart容器中停止docker。

例如,我使用此配置: 的 DOCKER_OPTS =&#34; -g / mydir / docker -r = false --dns 8.8.4.4&#34;

如果你想在一个容器中运行多进程,你应该使用 supervisord 作为第一个进程,supervisord将管理其他进程并向它们传输信号。