Docker容器运行主管太早关闭

时间:2014-08-25 16:01:49

标签: mysql docker supervisor

我正在运行一个具有多个进程的docker容器(以实现LAMP环境),使用如here所述的supervisor。一切正常,但是当我停止容器时,即使我在主管配置中设置了主管的pidproxy,MySQL进程也没有正确终止

[program:mysql]
command=/usr/bin/pidproxy /run/mysqld/mysqld.pid /bin/sh -c "exec /usr/bin/mysqld_safe"

当我通过nsenter访问容器并使用

重新启动MySQL守护程序时
supervisorctl restart mysql

关机完成后不会在下次出现时抛出错误。所以我认为主管配置正确。对我来说,似乎docker(我运行的是1.2.0)在mysqld仍在关闭的时候稍微终止了容器。

修改

我可以通过supervisord开关运行-e debug来调试更多详细信息。

通过nsenter关闭supervisorctl restart mysql

DEBG fd 17 closed, stopped monitoring <POutputDispatcher at 39322256 for <Subprocess at 38373280 with name mysql in state RUNNING> (stderr)>
DEBG fd 14 closed, stopped monitoring <POutputDispatcher at 39324128 for <Subprocess at 38373280 with name mysql in state RUNNING> (stdout)>
DEBG killing mysql (pid 1128) with signal SIGTERM
INFO stopped: mysql (exit status 0)
DEBG received SIGCLD indicating a child quit
CRIT reaped unknown pid 1129)
DEBG received SIGCLD indicating a child quit

外部通过docker restart container_name

DEBG fd 17 closed, stopped monitoring <POutputDispatcher at 39290136 for <Subprocess at 38373280 with name mysql in state RUNNING> (stderr)>
DEBG fd 14 closed, stopped monitoring <POutputDispatcher at 39290424 for <Subprocess at 38373280 with name mysql in state RUNNING> (stdout)>
DEBG killing mysql (pid 7871) with signal SIGTERM
INFO stopped: mysql (exit status 0)
DEBG received SIGCLD indicating a child quit

这是第一次尝试之前的流程结构:

 1128 S      0:00 /usr/bin/python /usr/bin/pidproxy /run/mysqld/mysqld.pid /usr/bin/mysqld_safe
 1129 S      0:00  \_ /bin/sh /usr/bin/mysqld_safe
 1463 Sl     0:00      \_ /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --user=mysql --log-erro

因此pid 1463 /run/mysqld/mysqld.pidpid 1129中得到了正确的收益,{{1}}会导致麻烦,因为docker会在容器关闭之前将其关闭。它是主管pidproxy中的错误还是可以通过不同的配置修复?

2 个答案:

答案 0 :(得分:2)

我有一个类似的问题,我通过不使用mysql_safe修复它,而是直接启动mysql。我通过查看ps aux概述中生成的mysql_safe命令来完成此操作。

也许它失败了,因为mysql_safe没有创建合适的父级 - &gt;孩子的过程关系?

无论如何,如果我使用你的mysql进程作为模板,我的配置看起来会像这样:

[program:mysql]
command=/usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --user=mysql --log-erro

答案 1 :(得分:1)

我相信Docker只会等待十秒才会杀死一个试图停止(或重启)的容器。这样就可以最终执行所请求的操作,而不仅仅是挂起。您可以使用“docker stop”或“docker restart”上的“--time”参数配置时间段。