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应用程序-例如dev
与prod
许可证-因此,我需要两个不同的文件服务)
编辑:第二项服务有效,因为它是先创建的:
$ docker stack deploy -c docker-compose.yml webapp1 --with-registry-auth
Creating service webapp1_tomcat_prod
Creating service webapp1_tomcat_dev
答案 0 :(得分:0)
我找到了一种解决方法,将服务分成两个不同的docker compose文件(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
...
我的直觉说我在docker-compose中的restart_policy
也太严格了(有max_attempts: 1
),可能是由于这个原因,无法及时/在一次重启中使用图像(如@ Ludo21South所建议)。因此,我允许进行更多尝试,但是由于我已经将服务分成了两个文件(它们已经起作用了),因此我没有检查该假设是否成立。