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-prod.yml
和 docker-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所建议的)。因此,我允许更多的尝试,但由于我已经将服务分离到两个文件上(已经工作了),我还没有检查这个假设是否正确。