You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 09:54:06