Docker-ce 20.10.x版本下Docker Stack Deploy覆盖配置时容器无法缩容至0副本的问题求助
Docker Swarm 20.10+ 无法通过叠加YAML设置副本数为0的解决方案
我之前升级Docker CE到20.10版本后,也碰到过一模一样的问题,折腾了好一阵才摸清楚原因。下面给你分享几种可行的解决办法和背后的逻辑:
一、快速临时解决:命令行直接调整副本数
如果只是需要快速把服务副本数设为0,可以在部署完成后执行这条命令:
docker service scale server_hello-server-api=0
要是想自动化这个流程,把这条命令加到你的部署脚本里,和docker stack deploy配合执行就行。
二、通过配置文件实现永久生效
如果你希望完全通过YAML配置来实现0副本的效果,可以修改customized.yml的写法,利用Swarm的节点约束让服务无法被调度:
version: '3.6' services: hello-server-api: deploy: mode: global placement: constraints: - node.role == nonexistent-role
这里我们把部署模式改成global,然后添加一个不存在的节点角色约束——因为没有任何节点能满足这个条件,服务自然会保持0副本的状态,完美适配你用叠加文件管理配置的需求。
三、调整基础配置逻辑(可选)
如果你的配置流程允许,也可以反过来:在base.yml里把replicas默认设为0,然后在customized.yml里根据生产环境需求设置具体的副本数(比如1、2等)。不过这个方法需要调整你现有的配置结构,适合新项目或者重构时采用。
问题根源
Docker CE 20.10版本对Compose文件的合并逻辑做了变更:之前的版本允许通过叠加文件将replicas覆盖为0,但新版本中,Swarm认为replicated模式下0是无效的副本数(默认至少需要1个),所以会忽略叠加文件里的replicas: 0设置,转而保留base.yml中的原始值。而当你设置非0的数值时,因为是有效的副本数,合并逻辑就会正常生效。
内容的提问来源于stack exchange,提问作者Angelo Delgado
相关产品推荐
相关产品推荐

