Docker组成了两个使用相同映像的服务:第一个失败,显示“无此映像”,第二个正常运行

时间:2020-05-11 09:48:57

标签: docker docker-compose gitlab-ci docker-swarm

TL; DR :除了服务名称和发布的端口之外,我的撰写文件中还有两个几乎相同的服务。使用docker stack deploy...进行部署时,为什么第一个服务失败并没有出现此类映像错误,而使用相同映像的第二个服务却运行得很好?

完整:我有一个包含两个Apache Tomcat服务的docker-compose文件,该文件从我的私有git存储库中提取相同的映像。 docker-compose.yml中两个服务之间的唯一区别是服务的名称(*_dev*_prod)和发布的端口。我使用带有gitlab-ci.yml的Gitlab CI将这个docker-compose文件部署到了我的集群中。为了在此gitlab-ci.yml中部署docker-compose,我使用了两个命令:

...
   script:
     - docker pull $REGISTRY:$TAG
     - docker stack deploy -c docker-commpose.yml webapp1 --with registry-auth
...

(我使用docker pull [image]命令将图像放置在正确的节点上,因为我的--with-registry-auth工作不正常,但这不是我的问题)。

现在奇怪的是,对于第一个服务,我收到一个No such image:错误,并且该服务已停止,而对于第二个服务,一切似乎都运行良好。两种服务都在同一工作节点上。如果我docker ps

:~$ docker service ps webapp1_tomcat_dev
ID          NAME                       IMAGE          NODE           DESIRED STATE       CURRENT STATE             ERROR                              PORTS
xxx1        webapp1_tomcat_dev.1       url/repo:tag   worker1 node   Shutdown            Rejected 10 minutes ago   "No such image: url/repo:tag@xxx…"
xxx2         \_ webapp1_tomcat_dev.1   url/repo:tag   worker1 node   Shutdown            Rejected 10 minutes ago   "No such image: url/repo:tag@xxx…"
:~$ docker service ps webapp1_tomcat_prod
ID          NAME                    IMAGE          NODE           DESIRED STATE       CURRENT STATE            ERROR               PORTS
xxx3        webapp1_tomcat_prod.1   url/repo:tag   worker1 node   Running             Running 13 minutes ago

我已经使用--no-trunc获得了IMAGE*_prod使用的*_dev是相同的。

我的docker-compose中的restart_policy解释了为什么第二项服务启动三分钟后第一项服务失败。这是我的docker-compose:

version: '3.2'

services:
  tomcat_dev:
    image: url/repo:tag
    deploy:
      restart_policy:
        condition: on-failure
        delay: 60s
        window: 120s
        max_attempts: 1
    ports:
      - "8282:8080"

  tomcat_prod:
    image: url/repo:tag
    deploy:
      restart_policy:
        condition: on-failure
        delay: 60s
        window: 120s
        max_attempts: 1
    ports:
      - "8283:8080"

为什么第一个服务失败并没有此类图像错误?例如,是否不可能有两个使用相同图像的服务在同一个工作节点上工作?

(我不能简单地扩展一项服务,因为我需要将针对生产和开发不同的文件上传到Web应用程序-例如devprod许可证-因此,我需要两个不同的文件服务)

编辑:第二项服务有效,因为它是先创建的:

$ docker stack deploy -c docker-compose.yml webapp1 --with-registry-auth
Creating service webapp1_tomcat_prod
Creating service webapp1_tomcat_dev

1 个答案:

答案 0 :(得分:0)

我找到了一种解决方法,将服务分成两个不同的docker compose文件(docker-compose-prod.ymldocker-compose-dev.yml),并在我的docker stack deploy中执行两次gitlab-ci.yml命令:

...
   script:
     - docker pull $REGISTRY:$TAG
     - docker stack deploy -c docker-commpose-prod.yml webapp1 --with registry-auth
     - docker pull $REGISTRY:$TAG
     - docker stack deploy -c docker-commpose-dev.yml webapp1 --with registry-auth

...

我的直觉说我在docker-compose中的restart_policy也太严格了(有max_attempts: 1),可能是由于这个原因,无法及时/在一次重启中使用图像(如@ Ludo21South所建议)。因此,我允许进行更多尝试,但是由于我已经将服务分成了两个文件(它们已经起作用了),因此我没有检查该假设是否成立。