小编Pep*_*sko的帖子

全局模式下的 Docker swarm 在更新时对某些服务制作了太多副本

我将单主机 docker swarm 应用程序设置为全局模式(以便每个服务只有 1 个副本)。由于某种原因,更新 swarm 后,某些服务显示 2/2 副本。看起来新容器启动后旧容器并没有停止。我发现,当替换 mysql 容器时会发生这种情况(并且它是唯一具有order: stop-first内部更新配置的服务)。往往会获得太多副本的服务依赖于数据库,并且在部署时它们会失败,直到数据库准备就绪为止(但由于某种原因,此时有两个副本 - 旧的和新的)。要解决此问题,我需要再次运行部署。

我的环境是由 CI/CD 部署的,它按顺序执行:

  1. docker-compose -f build-images.yml 构建
  2. docker-compose -f build-images.yml 推送到私有 docker 注册表(也在同一主机和 swarm 上)
  3. docker镜像修剪-a
  4. docker stack deploy -c test-swarm.yml 测试

现在我实际上有两个问题:

首先,尽管代码没有任何变化,但 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)

docker docker-compose docker-swarm docker-swarm-mode

5
推荐指数
0
解决办法
893
查看次数