docker compose can';t通过服务名称连接到相邻服务

docker compose can';t通过服务名称连接到相邻服务,docker,docker-compose,cypress,docker-network,Docker,Docker Compose,Cypress,Docker Network,我有一个docker-compose.yml,它基本上为e2e测试构建了我的项目。它由一个postgres db、一个后端节点应用程序、一个前端节点应用程序和一个使用cypress运行e2e测试的spec应用程序组成。 版本:“3” services: database: image: 'postgres' backend: build: ./backend command: /bin/bash -c "sleep 3; yarn back

我有一个docker-compose.yml,它基本上为e2e测试构建了我的项目。它由一个postgres db、一个后端节点应用程序、一个前端节点应用程序和一个使用cypress运行e2e测试的spec应用程序组成。 版本:“3”

  services:
    database:
      image: 'postgres'
    backend:
      build: ./backend
      command: /bin/bash -c "sleep 3; yarn backpack dev"
      depends_on:
        - database
    frontend:
      build: ./frontend
      command: /bin/bash -c "sleep 15; yarn nuxt"
      depends_on:
        - backend
    spec:
      build:
        context: ./frontend
        dockerfile: Dockerfile.e2e
      command: /bin/bash -c "sleep 30; yarn cypress run"
      depends_on:
        - frontend
        - backend
DockerFile只是基于node:8的简单DockerFile,node:8复制项目文件并运行
Thread install
。在spec Dockerfile中,我传递
http://frontend:3000
作为前端URL

但当my cypress runner无法连接到前端时,此设置在
spec
命令下失败,错误为:

  spec_1      |   > Error: connect ECONNREFUSED 172.20.0.4:3000
如您所见,它将主机名
frontend
正确解析为IP,但无法连接。我在琢磨为什么我不能用服务名称连接到前端。如果我打开
spec
执行
sleep 30;ping前端
,它正在成功ping容器。我尝试删除并让docker compose重新创建网络,我尝试分别指定服务的
expose
links
。一切都没有成功

如果您想复制该问题,我已在此处设置了一个示例回购:


非常感谢您的帮助!谢谢大家!

您的应用程序正在侦听环回:

$ docker run --rm --net container:demo-dockercompose-network_frontend_1 nicolaka/netshoot ss -lnt                                                               
State      Recv-Q Send-Q Local Address:Port               Peer Address:Port
LISTEN     0      128    127.0.0.11:35233                    *:*
LISTEN     0      128    127.0.0.1:3000                     *:*
从容器外部,无法连接到仅侦听环回的端口(
127.0.0.1
)。您需要重新配置应用程序以侦听所有接口(
0.0.0.0

对于您的应用程序,在package.json中,您可以添加(根据以下内容):

那么你应该看到:

$ docker run --rm --net container:demo-dockercompose-network_frontend_1 nicolaka/netshoot ss -lnt
State      Recv-Q Send-Q Local Address:Port               Peer Address:Port
LISTEN     0      128          *:3000                     *:*
LISTEN     0      128    127.0.0.11:39195                    *:*
现在,您将得到一个500:

...
frontend_1  |   response: undefined,        
frontend_1  |   statusCode: 500,                                                                 
frontend_1  |   name: 'NuxtServerError' }
...
spec_1      | The response we received from your web server was:
spec_1      |                                                                                     
spec_1      |   > 500: Server Error                 

谢谢它正在工作。p、 我还用更新的工作解决方案更新了演示github repo。只是与之前的提交不同,看看我做了什么。
...
frontend_1  |   response: undefined,        
frontend_1  |   statusCode: 500,                                                                 
frontend_1  |   name: 'NuxtServerError' }
...
spec_1      | The response we received from your web server was:
spec_1      |                                                                                     
spec_1      |   > 500: Server Error