我已经使用start-first
选项将堆栈部署到群组中了很长一段时间。
所以给出了以下api.yml
文件:
version: '3.4'
services:
api:
image: registry.gitlab.com/myproj/api:${VERSION}
deploy:
update_config:
order: start-first
我会针对群体管理器运行以下命令:
env VERSION=x.y.z docker stack deploy -f api.yml api
这很好用 - 旧服务一直服务请求,直到新服务完全可用。只有这样它才会被拆除并进入关闭状态。
现在最近,我相信这开始发生在docker v17.12.0-ce或v18.01.0-ce上 - 或者我之前没有注意到 - 相反的是旧服务有时没有被正确停止。< / p>
当发生这种情况时,它会挂起并继续处理请求,导致我们无限期地并排运行旧版本和新版本。
对于已复制服务的群组,以及使用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>
甚至会锁定,只是坐在那里。
我发现摆脱它们的唯一方法是重启节点。由于复制,我实际上可以在没有停机的情况下做到这一点,但由于各种原因它并不是很好,其中最少的是如果另外一位经理在我这样做的时候会崩溃的话。
还有其他人看过这种行为吗?可能是什么原因以及如何调试?