Docker群停止宽限期未按预期工作

时间:2019-03-11 13:59:53

标签: docker docker-swarm

我在集群模式下以集群模式运行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服务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. docker ps -a enter image description here
  5. 如您所见,新容器已启动,一秒钟后, 老家伙被Docker杀死了。

知道为什么吗?

我还在Github上发布了一个问题,网址为:https://github.com/docker/for-linux/issues/615

2 个答案:

答案 0 :(得分:0)

我认为您可以在GitHub上解决此问题。

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

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

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

答案 1 :(得分:0)

--stop-grace-period值是Docker在发送sigterm后放弃等待优雅退出容器的等待时间。宽限期完成后,它将使用sigkill杀死容器。

事件的顺序似乎是根据您对设置的描述而设计的。您的容器在收到其sigterm时会干净而快速地退出,因此Docker无需发送sigkill。

我看到您还指定了--update-delay 60,但由于您只有一个副本,因此该设置无效。更新延迟将通知docker在循环执行第一个任务后等待60秒,因此它仅对2个或更多副本有用。

您似乎希望您的单副本服务同时运行一个新任务和一个旧任务60秒,但是新模式启动后,群集模式很高兴用sigterm摆脱旧容器。< / p>