情况是这样的:
我有三个不同的docker为三个不同的项目编写文件:前端、中间件和后端。fe是ember、中间件和后端spring(boot)。但这在这里不重要。中间件使用到后端的外部_链接,前端(ui)使用到中间件的外部_链接。
当我从一个干净的docker(docker stop$(docker ps-aq)、docker rm$(docker ps-aq))开始时,一切都很好:我从docker compose up、middleware、frontend开始后端。一切都很好,所有外部链接都可以工作(也可以在此设置上运行cypress e2e测试-工作正常)。
现在,当我在中间件中更改一些内容,重新生成图像,停止容器(control+c)并使用docker compose up重新启动它,然后尝试重新启动前端(control+c,然后docker compose up),docker会告诉我:
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向我展示了中间件的容器实际上正在运行。
不幸的是,我不能在这里发布撰写文件,但我愿意添加任何需要的信息。
在Docker18.09.0版本上运行,构建4D60DB4
ubuntu 18.04.1 LTS公司
我想重新启动这些容器中的任何一个,而不需要断开外部链接。我怎样才能做到这一点?
既然你们花时间给我,我花时间把两首曲子删掉了。这是用户界面/前端:
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”基本上与中间件相同。
请注意:我删除了卷和环境。另外,我重命名了,这样错误消息名称就不会完全匹配。请注意命名模式是相同的:服务名类似于“中间件”,容器名使用前缀“x-middleware”。