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

docker-compose can't connect to adjacent service via service name

我有这个 docker-compose.yml 基本上可以构建我的 e2e 测试项目。它由一个 postgres 数据库、一个后端节点应用程序、一个前端节点应用程序和一个使用 cypress 运行s 端到端测试的规范应用程序组成。 版本:'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

Dockerfiles 只是简单的 Dockerfiles,它基于 node:8 复制项目文件和 运行 yarn install。在规范 Dockerfile 中,我将 http://frontend:3000 作为 FRONTEND_URL.

传递

但是当我的 cypress 运行ner 无法连接到 frontend 并出现错误时,此设置在 spec 命令中失败:

  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

非常感谢任何帮助!谢谢!

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

$ 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