Mysql Docker集装箱运行主管过早关闭

Mysql Docker集装箱运行主管过早关闭,mysql,docker,supervisord,Mysql,Docker,Supervisord,我正在使用如上所述的supervisor运行具有多个进程的docker容器(以实现LAMP环境)。一切正常,但当我停止容器时,MySQL进程不会正确终止,即使我在supervisor配置中设置了supervisor的pidproxy [program:mysql] command=/usr/bin/pidproxy /run/mysqld/mysqld.pid /bin/sh -c "exec /usr/bin/mysqld_safe" 当我通过nsenter访问容器并用 supervisor

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

[program:mysql]
command=/usr/bin/pidproxy /run/mysqld/mysqld.pid /bin/sh -c "exec /usr/bin/mysqld_safe"
当我通过nsenter访问容器并用

supervisorctl restart mysql
关闭完成,下次出现错误时不会抛出错误。所以我认为主管配置正确。在我看来,docker(我运行的是1.2.0)在mysqld仍在关闭时提前终止了容器

编辑 通过使用
-e debug
开关运行
supervisord
,我可以调试更多细节

使用
监视器关机或通过nsenter重新启动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
这是第一次尝试之前的流程结构:

 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
会导致问题,因为docker在容器离开之前关闭了它。这是supervisor的pidproxy中的一个bug,还是可以通过不同的配置来修复?

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

我有一个类似的问题,我通过不使用mysql\u-safe,而是直接启动mysql来修复它。我通过查看在
ps aux
概述中生成的命令mysql\u safe来实现这一点

可能它失败是因为
mysql\u-safe
没有创建正确的父进程->子进程关系

无论如何,如果我使用您的mysql进程作为模板,我的配置将如下所示:

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

谢谢你的想法,Arthur,但是在我的例子中,容器内的正确重启只需要一秒钟。因此,添加
--time
参数没有效果。在中间mysqld_安全进程终止之前,Supervisor似乎真的以0退出。
[program:mysql]
command=/usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --user=mysql --log-erro