【问题标题】:Docker container running supervisor shuts down too early运行主管的 Docker 容器过早关闭
【发布时间】:2019-08-10 23:05:27
【问题描述】:

我正在使用here 中描述的主管运行具有多个进程的 docker 容器(以实现 LAMP 环境)。一切正常,但是当我停止容器时,即使我在主管配置中设置了主管的 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 仍在关闭时提前终止了容器。

编辑

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

通过 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 会导致麻烦,因为 docker 在容器消失之前将其关闭。是主管的 pidproxy 中的错误还是可以通过不同的配置修复?

【问题讨论】:

    标签: mysql docker supervisord


    【解决方案1】:

    我遇到了类似的问题,我通过不使用 mysql_safe 而是直接启动 mysql 来解决它。我通过查看ps aux 概述中生成的命令 mysql_safe 来做到这一点。

    可能因为mysql_safe 没有创建正确的父-> 子进程关系而失败?

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 感谢 Arthur 的想法,但在我的情况下,容器内的正确重启只需要大约一秒钟。所以添加--time参数是没有效果的。在中间 mysqld_safe 进程终止之前,Supervisor 似乎真的以 0 退出。
      猜你喜欢
      • 2015-09-20
      • 1970-01-01
      • 1970-01-01
      • 2016-06-30
      • 2017-12-20
      • 2017-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多