docker-compose无法通过服务名称连接到相邻服务

时间:2018-08-02 12:59:38

标签: docker docker-compose cypress docker-network

我有这个docker-compose.yml,基本上可以构建我的项目以进行e2e测试。它由一个postgres数据库,一个后端Node应用程序,一个前端Node应用程序以及一个使用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,它复制项目文件并运行yarn install。在规范Dockerfile中,我以http://frontend:3000作为FRONTEND_URL传递。

但是当我的柏树赛跑者无法通过错误连接到spec时,此设置在frontend命令处失败:

  spec_1      |   > Error: connect ECONNREFUSED 172.20.0.4:3000

如您所见,它可以将主机名frontend正确解析为IP,但无法连接。我为解决为什么不能使用服务名称连接到前端而烦恼。如果我在spec上切换命令以执行sleep 30; ping frontend,则表示已成功ping通该容器。我尝试删除并让docker-compose重新创建网络,我尝试分别为服务指定exposelinks。一切都没有成功。

如果您想复制问题,我在这里设置了一个示例存储库: https://github.com/afifsohaili/demo-dockercompose-network

任何帮助将不胜感激!谢谢!

1 个答案:

答案 0 :(得分:2)

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

$ 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中添加(根据nuxt faq):

  "config": {
    "nuxt": {
      "host": "0.0.0.0",
      "port": "3000"
    }
  },

然后您应该看到:

$ 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