【问题标题】:Docker swarm stop grace period doesn't work as expectedDocker swarm stop 宽限期未按预期工作
【发布时间】:2019-03-11 13:59:52
【问题描述】:

我在集群模式下运行 Docker,集群中有多个节点。 根据此处编写的文档:https://docs.docker.com/engine/reference/commandline/service_update/ 和此处:https://docs.docker.com/engine/reference/commandline/service_create/,--stop-grace-period 命令设置强制杀死容器之前的等待时间。

预期行为 - 我的预期是 Docker 在滚动更新期间会等待这段时间,直到它尝试停止正在运行的容器。

实际行为 - Docker 会在几秒钟后发送终止信号,带有新版本镜像的新容器启动。

重现行为的步骤

  1. docker service create --replicas 1 --stop-grace-period 60s --update-delay 60s --update-monitor 5s --update-order start-first --name nginx nginx:1.15.8
  2. 等待服务启动容器(大约 2 分钟)
  3. docker 服务更新--image nginx:1.15.9 nginx
  4. 码头工人ps -a
  5. 如您所见,新容器已启动,一秒钟后, 旧的被 Docker 杀死了。

知道为什么吗?

我还在 Github 上打开了一个问题,在这里:https://github.com/docker/for-linux/issues/615

【问题讨论】:

    标签: docker docker-swarm


    【解决方案1】:

    --stop-grace-period 值是 Docker 在发送 sigterm 后等待容器优雅退出的时间量。宽限期结束后,它将通过 sigkill 终止容器。

    事件的顺序似乎是根据您对设置的描述而设计的。当你的容器得到它的 sigterm 时,它会干净而快速地退出,所以 Docker 永远不需要发送 sigkill。

    我看到您还指定了--update-delay 60,但这不会生效,因为您只有一个副本。更新延迟会告诉 docker 在循环第一个任务后等待 60 秒,因此它仅对 2 个或更多副本有用。

    您似乎希望您的单副本服务同时运行一个新任务和一个旧任务 60 秒,但集群模式很乐意在新容器启动后立即使用 sigterm 删除旧容器。

    【讨论】:

    • 是的。这就是我想要做的。延迟发送 o SIGTERM 一段特定的时间。在这种情况下,60 秒。有什么办法可以延缓吗?
    【解决方案2】:

    我认为你可以在 GitHub 上关闭该问题。

    stop-grace-period 这是停止 (SIGTERM) 和终止 (SIGKILL) 之间的时间段。

    当然,您可以使用--stop-signal 开关将 SIGTERM 更改为另一个信号。当收到停止信号时,应用程序进入容器的行为是您的责任。

    Here解释这个厨房的好文章。

    【讨论】:

    • 我同意github issue可以关闭了。
    • @programmerq,别担心,他们不会修复真正的错误。他们通过自动批处理关闭这类问题:)
    • 感谢您的链接。我已经读过了。我正在尝试延迟 SIGTERM 的发送。有办法吗?
    • 让我们更深入地讨论您的工作,以及如何捕获停止信号并将这些事件准备到容器中。我不认为你可以延迟发送停止信号
    猜你喜欢
    • 1970-01-01
    • 2020-04-26
    • 2015-06-06
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 2020-11-18
    • 1970-01-01
    • 2020-07-19
    相关资源
    最近更新 更多