使用docker-compose --scale命令时容器超额创建问题咨询
首先可以明确:你的操作本身没有错误,这个异常现象大概率是你使用的docker-compose 1.21.2和Docker 18.03.1-ce版本存在已知的scale命令一致性bug导致的。
具体原因
你使用的这两个版本都属于比较老旧的版本(docker-compose 1.x分支的早期版本,Docker引擎也是多年前的稳定版),在处理docker-compose up -d --scale命令时,存在容器计数逻辑的问题:
- 第一次执行命令时,compose没有正确识别当前属于指定项目(
-p some-service)的目标服务(some-service1)的运行容器数量,错误地判定需要额外创建容器,导致超出预期数量; - 第二次执行相同命令时,compose重新拉取了容器的元数据,正确计算了期望数量与实际运行数量的差值,因此会停止并删除多余的容器,将数量恢复到指定的7个。
这类bug在后续的docker-compose版本(尤其是1.25.x及以上的1.x版本,以及现在的compose v2版本)中已经被修复,同时Docker引擎的新版本也优化了容器元数据的查询逻辑,避免了这类计数错误。
解决方案
优先升级版本(最根本的解决办法)
- 升级docker-compose到最新的稳定版:建议直接迁移到Docker Compose v2(现在是官方主推版本,集成在Docker引擎中,使用
docker compose命令代替docker-compose),如果坚持用1.x分支,至少升级到1.29.x版本; - 升级Docker引擎到支持的稳定版本:比如20.10.x或更高版本,18.03版本早已不在官方支持范围内,不仅有bug,还存在安全风险。
- 升级docker-compose到最新的稳定版:建议直接迁移到Docker Compose v2(现在是官方主推版本,集成在Docker引擎中,使用
临时 workaround(无法立即升级时)
如果暂时无法升级,可以在执行scale命令前,先强制compose重新同步容器状态:docker-compose -p some-service ps -q some-service1 | wc -l先手动确认当前运行的容器数量,再执行scale命令;或者在定时任务中增加一步,执行:
docker-compose -p some-service up -d --no-recreate --scale some_service1=7加上
--no-recreate参数,避免compose重复创建已存在的容器(不过这个参数在旧版本中对scale逻辑的优化有限,还是升级更可靠)。
额外验证
你可以手动执行一次命令,观察容器名称(使用docker ps查看):第一次执行后,会看到超出7个的容器(比如some-service_some-service1_8、some-service_some-service1_9等),第二次执行后这些多余的容器会被清理掉,这也能验证是版本bug导致的计数错误。
内容的提问来源于stack exchange,提问作者Sundeep

