docker stack deploy 在更新后留下旧服务

sas*_*sas 6 docker docker-swarm

start-first很长一段时间以来,我一直在使用该选项将堆栈部署到集群中。

所以给出以下api.yml文件:

version: '3.4'

services:

  api:
    image: registry.gitlab.com/myproj/api:${VERSION}
    deploy:
      update_config:
        order: start-first
Run Code Online (Sandbox Code Playgroud)

我会针对群管理器运行以下命令:

env VERSION=x.y.z docker stack deploy -f api.yml api
Run Code Online (Sandbox Code Playgroud)

这工作得很好 - 旧服务一直为请求提供服务,直到新服务完全可用。只有这样它才会被拆除并进入关机状态。

最近,我相信这开始发生在 docker v17.12.0-ce 或 v18.01.0-ce - 或者我之前没有注意到 - 相反发生的是旧服务有时没有正确停止。

当这种情况发生时,它会挂起并继续服务请求,导致我们无限期地并排运行新旧版本。

这既发生在复制了服务的集群上,也发生在使用scale=1.

更糟糕的是,我什至无法杀死旧容器。这是我尝试过的:

  • docker service rm api_api
  • docker stack rm api && docker stack deploy -f api.yml api
  • docker rm -f <container id>

没有什么能让我摆脱“僵尸”容器。事实上,docker rm -f <container id>甚至锁上,只是坐在那里。

我发现摆脱它们的唯一方法是重新启动 node。多亏了复制,我实际上可以在不停机的情况下做到这一点,但由于各种原因,这不是很好,其中最重要的是如果另一位经理在我这样做时停机可能会发生什么。

有没有其他人看到过这种行为?可能是什么原因,我该如何调试?

小智 1

尝试设置max_replicas_per_node(如果每个节点只需要一个副本,则为 1)placement尝试在部分

参考https://docs.docker.com/compose/compose-file/compose-file-v3/