我正在运行一个具有多个进程的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.pid
在pid 1129
中得到了正确的收益,{{1}}会导致麻烦,因为docker会在容器关闭之前将其关闭。它是主管pidproxy中的错误还是可以通过不同的配置修复?
答案 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”参数配置时间段。