【问题标题】:Why systemd process running in docker container with PID 1 not forwarding SIGTERM to child processes on docker stop为什么在 PID 1 的 docker 容器中运行的 systemd 进程没有将 SIGTERM 转发到 docker stop 上的子进程
【发布时间】:2017-06-08 01:47:39
【问题描述】:

我们有 Docker 容器,它运行 systemd 作为主进程 (PID 1)。我们还通过 systemd 单元在 Docker 容器中启动了我们的工作进程。我们的 Docker 容器使用 CentOS 7.2。 我们已经配置了 Docker 停止超时,以便我们可以处理在 Docker 容器中运行的工作进程的正常关闭。 当我们停止 Docker 容器时,我们可以看到 SIGTERM 被接收到在容器内以 PID 1 运行的 systemd 进程。容器还等待我们配置的停止超时。 但是systemd 进程不会将此 SIGTERM 转发给我们已经开始使用 systemd 单元的工作进程。 从日志看,当 systemd 收到 SIGTERM 时,它会尝试重新执行自己。我们曾尝试在我们的 systemd 单元文件中添加 KillMode=mixed,但它对我们不起作用。

有没有办法将 SIGTERM 从 systemd 进程转发到子进程?

【问题讨论】:

  • 从共享文章看来,常规系统初始化(在我们的例子中是 systemd)应该能够将 SIGTERM 转发给子进程,但在我们的例子中完全不会发生这种情况。我们想使用 systemd 进行设置。寻找将信号从 systemd 传递到子进程的方法。

标签: docker centos7 systemd sigterm


【解决方案1】:

除了运行 systemd 本身,您还可以尝试使用提供类似功能的替代品。如果您将docker-systemctl-replacement 作为容器的入口点,那么它将查找您提供的 systemd 单元文件 - 在容器启动时,它从单元描述符运行 ExecStart,在接收到 SIGSTOP 后,它将从每个单元描述符运行 ExecStop。听起来这就是您想要的功能。

【讨论】:

    【解决方案2】:

    请粘贴您的 docker run 命令。

    我猜你必须添加这两个选项。

    --stop-signal=SIGRTMIN+3 --env container=docker
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-17
      • 1970-01-01
      • 1970-01-01
      • 2016-05-12
      • 2019-06-23
      • 1970-01-01
      • 2019-06-01
      • 2018-09-22
      相关资源
      最近更新 更多