1

我以集群模式运行 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 service update --image nginx:1.15.9 nginx
  4. 码头工人ps -a 在此处输入图像描述
  5. 如您所见,新容器启动,一秒钟后,旧容器被 Docker 杀死。

知道为什么吗?

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

4

2 回答 2

1

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

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

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

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

于 2019-03-11T14:12:14.307 回答
1

--stop-grace-period值是 Docker 在发送 sigterm 并放弃等待容器正常退出后将等待的时间量。宽限期完成后,它将使用 sigkill 终止容器。

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

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

看起来您希望您的单副本服务同时运行一个新任务和一个旧任务 60 秒,但是一旦新容器启动,swarm 模式很乐意使用 sigterm 摆脱旧容器。

于 2019-03-11T14:12:34.227 回答