情况是这样的:我有三个不同的 docker 为三个不同的项目编写文件:一个前端、一个中间件和一个后端。FE 是 Ember、中间件和后端 spring(引导)。不过,这在这里无关紧要。中间件使用 external_link 到后端,前端 (UI) 使用 external_link 到中间件。
当我从一个干净的 docker (docker stop $(docker ps -aq), docker rm $(docker ps -aq)) 开始时,一切正常:我用 docker-compose up 启动后端,然后是中间件,然后是前端。一切都很好,所有外部链接都可以正常工作(也在此设置上运行赛普拉斯 e2e 测试 - 工作正常)。
现在,当我在中间件中更改某些内容时,重建映像,停止容器(control+c)并使用 docker-compose up 重新启动它,然后尝试重新启动前端(control + c 然后 docker-compose up),码头工人会告诉我:
Starting UI ... error
ERROR: for UI Cannot start service ui: Cannot link to a non running container: /32f2db8e96a1_middleware AS /ui/backend
ERROR: for UI Cannot start service ui: Cannot link to a non running container: /32f2db8e96a1_middleware AS /ui/backend
ERROR: Encountered errors while bringing up the project.
现在让我恼火的是:“32f2db8e96a1”是从哪里来的?中间件容器名称设置为“middleware”,也用于UI的外部链接,每次干净启动都可以正常工作(意思是之前使用docker rm“-all”)。此外, docker ps 显示中间件的容器实际上正在运行。
不幸的是,我不能在这里发布撰写文件,但我愿意添加任何需要的信息。
在 Docker 版本 18.09.0 上运行,构建 4d60db4 Ubuntu 18.04.1 LTS
我想在没有损坏外部链接的情况下重新启动这些容器中的任何一个。我如何实现这一目标?
既然你们花时间陪我,我就花时间清理了两个作曲。这是 UI/前端之一:
files:
version: '2.1'
services:
ui:
container_name: x-ui
build:
dockerfile: Dockerfile
context: .
image: "xxx/ui:latest"
external_links:
- "middleware:backend"
ports:
- "127.0.0.1:4200:80"
network_mode: bridge
这是中间件:
version: '2.1'
services:
middleware:
container_name: x-middleware
image: xxx/middleware:latest
build:
dockerfile: src/main/docker/middleware/Dockerfile
context: .
ports:
- "127.0.0.1:8080:8080"
- "127.0.0.1:9003:9000"
external_links:
- "api"
network_mode: "bridge"
“api”本质上与中间件相同。
请注意:我删除了卷和环境。我也重命名了,这样错误消息的名称就不会完美匹配。请注意命名模式是相同的:服务名称类似于“middleware”,容器名称使用前缀“x-middleware”。