首页 文章

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

提问于
浏览
3

我有这个docker-compose.yml,它基本上构建了我的e2e测试项目 . 它由一个postgres数据库,一个后端节点应用程序,一个前端节点应用程序和一个使用cypress运行e2e测试的规范应用程序组成 . 版本:'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:8复制项目文件并运行 yarn install . 在规范Dockerfile中,我将 http://frontend:3000 传递为FRONTEND_URL .

但是当我的cypress运行器无法连接到 frontend 时,此设置在 spec 命令时失败:

spec_1      |   > Error: connect ECONNREFUSED 172.20.0.4:3000

正如您所看到的,它正确地将主机名 frontend 解析为IP,但它为什么我无法连接到具有服务名称的前端 . 如果我在 spec 上切换命令做 sleep 30; ping frontend ,它's successfully pinging the container. I'已尝试删除并让docker-compose重新创建网络,我已经尝试分别为服务指定 exposelinks . 一切都没有成功 .

如果你想尝试复制这个问题,我在这里设置了一个样本仓库:https://github.com/afifsohaili/demo-dockercompose-network

任何帮助是极大的赞赏!谢谢!

1 回答

  • 1

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

    $ 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
    

相关问题