我将单主机 docker swarm 应用程序设置为全局模式(以便每个服务只有 1 个副本)。由于某种原因,更新 swarm 后,某些服务显示 2/2 副本。看起来新容器启动后旧容器并没有停止。我发现,当替换 mysql 容器时会发生这种情况(并且它是唯一具有order: stop-first内部更新配置的服务)。往往会获得太多副本的服务依赖于数据库,并且在部署时它们会失败,直到数据库准备就绪为止(但由于某种原因,此时有两个副本 - 旧的和新的)。要解决此问题,我需要再次运行部署。
我的环境是由 CI/CD 部署的,它按顺序执行:
现在我实际上有两个问题:
首先,尽管代码没有任何变化,但 mysql 大部分时间都在更新。它构建新的映像(这是可以理解的,因为我做了 image prune -a),然后由于某种原因将其作为新层推送到注册表,然后用完全相同的容器替换旧的 mysql 容器。此行为导致几乎每次我更改任何其他服务时,都会出现上面描述的副本问题。
其次,即使在更新数据库时创建并运行新的容器副本,旧的容器副本也会保留,从而产生过多的副本(并且旧版本会获取 API 调用等所有操作)。
我的 test-swarm.yml 的一部分包含数据库和重复的服务之一:
services:
#BACKEND
db:
image: registry.address/db:latest
user: "${UID}:${GID}"
deploy:
mode: global
update_config:
failure_action: pause
order: stop-first
healthcheck:
test: [ "CMD-SHELL", "mysqladmin --defaults-file=/home/.my.cnf -u root status || exit …Run Code Online (Sandbox Code Playgroud)