docker stack deploy 不删除当前 yaml compose 文件中未声明的服务

docker stack deploy do not remove services that are not declared in the current yaml compose file

我目前正在管道中使用 Docker Swarm 模式,我大量使用 docker stack deploy -c compose-file.yml name-of-the-stack 作为命令以使用最新的 docker 图像更新堆栈。它完美地工作,除非我不从 yaml 文件中删除服务。在这种情况下,stack deploy 命令应该在更新另一个图像的基础上删除不再存在的服务,但行为是它离开容器 运行,这不是预期的行为。 因此,我将其更改为 docker stack rm name-of-the-service,然后是 docker stack deploy -c compose-file.yml name-of-stack。但这有另一个随机影响容器的可怕副作用:命令 docker stack rm name-of-the-stack 经常使 nginx 容器 proxypass 的可靠性完全不可靠(似乎与此问题有关 https://github.com/docker/docker/issues/24244)。 事实上,nginx 容器(在另一个堆栈中但在同一个覆盖网络中)负责处理容器之间的所有请求,并使用 Docker 的路由网格功能在它们之间进行代理传递在重新创建部署的堆栈后,Swarm 模式无法代理请求,就像它尝试将流量转发到不再存在的容器一样,这会导致集成和行为测试失败。 有没有一种方法可以在不使用 docker stack rm(到目前为止看起来很麻烦)但应用 yml 撰写文件的最新状态的情况下进行一致部署?

您需要在 docker stack deploy 命令中包含 --prune 选项:

$ docker stack deploy --help

Usage:  docker stack deploy [OPTIONS] STACK

Deploy a new stack or update an existing stack

Aliases:
  deploy, up

Options:
      --bundle-file string    Path to a Distributed Application Bundle file
  -c, --compose-file string   Path to a Compose file
      --help                  Print usage
      --prune                 Prune services that are no longer referenced
      --with-registry-auth    Send registry authentication details to Swarm agents