【问题标题】:docker-compose can't connect to adjacent service via service namedocker-compose 无法通过服务名称连接到相邻服务
【发布时间】:2018-08-02 12:59:37
【问题描述】:

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

但是当我的 cypress runner 无法连接到 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 docker-compose cypress docker-network


    【解决方案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                 
    

    【讨论】:

    • 谢谢!它现在正在工作。 p.s.对于你们其他人 - 我还使用更新的工作解决方案更新了演示 github 存储库。只需与之前的提交进行比较,看看我做了什么。
    猜你喜欢
    • 1970-01-01
    • 2021-10-11
    • 2016-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-20
    • 1970-01-01
    • 2020-05-18
    相关资源
    最近更新 更多