Docker编译,两个服务使用相同的镜像:第一个以 "no such image "失败,第二个正常运行。

问题描述 投票:1回答:1

TL;DR: 我的compose文件中有两个几乎完全相同的服务,除了服务的名称和发布的端口。当我用 docker stack deploy...为什么第一个服务失败时出现 "无此映像 "的错误,而使用相同映像的第二个服务却能完美运行?

全文: 我有一个docker-compose文件,其中有两个Apache Tomcat服务,从我的私有git仓库中拉出相同的镜像。我的两个服务之间的唯一区别是 docker-compose.yml 是服务的名称(*_dev*_prod)和发布的端口。我使用 Gitlab CI 将这个 docker-compose 文件部署到我的 swarm 上,并在其中添加了 gitlab-ci.yml. 对于我的docker-compose的部署在这个 gitlab-ci.yml 我使用两个命令。

...
   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 是相同的。

restart_policy 在我的docker-compose中,解释了为什么第一个服务在第二个服务启动三分钟后失败。下面是我的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"

为什么第一个服务在没有镜像的情况下失败?例如,是否不可能让两个使用相同镜像的服务在同一个工作节点上工作?

(我不能简单地扩大一个服务的规模,因为我需要上传文件到webapp,而这些文件在生产和开发中是不同的--如 dev vs prod 许可证 - 因此我需要两种不同的服务)

EDIT: 第二个服务工作了,因为它是先创建的。

$ docker stack deploy -c docker-compose.yml webapp1 --with-registry-auth
Creating service webapp1_tomcat_prod
Creating service webapp1_tomcat_dev
docker docker-compose gitlab-ci docker-swarm
1个回答
0
投票

我找到了一个解决办法,将我的服务分离到两个不同的docker编译文件中 (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

...

我的直觉告诉我 restart_policy 我的docker-compose也太严格了(在我的docker-compose里有一个 max_attempts: 1),可能是由于这个原因,图像无法在一次重启中及时使用(如@Ludo21South所建议的)。因此,我允许更多的尝试,但由于我已经将服务分离到两个文件上(已经工作了),我还没有检查这个假设是否正确。

© www.soinside.com 2019 - 2024. All rights reserved.