docker - docker-compose 无法通过服务名称连接到相邻服务
问题描述
我有这个 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 传递。
spec
但是当我的 cypress runner 无法连接到frontend
错误时,此设置在命令中失败:
spec_1 | > Error: connect ECONNREFUSED 172.20.0.4:3000
如您所见,它将主机名frontend
正确解析为 IP,但无法连接。我正在为为什么不能使用服务名称连接到前端而摸不着头脑。如果我打开命令spec
do sleep 30; ping frontend
,它会成功 ping 容器。我试过删除并让 docker-compose 重新创建网络,我试过分别指定expose
和links
服务。一切都没有成功。
如果你想尝试复制问题,我在这里设置了一个示例 repo: https ://github.com/afifsohili/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
推荐阅读
- unity3d - 将游戏对象从 Unity 中的生成器连接到窗格?
- javascript - 如何在不刷新页面的情况下自动更新角度购物车中的产品数量
- vue.js - vue v-else 没有对应的 v-if
- javascript - Vue-Router 仅适用于某些路由
- android - 如何从 MainActivity 传递 arraylist 以将 listview 显示到 Main2Activity?
- parallel-processing - 如何使用 Rayon 检测整数总和的溢出?
- android - 当特征图像为空时,我的 Android 应用程序被强制停止
- haskell - 如何在 Dhall 中定义和使用类似 Haskell 的 sum 类型
- tensorflow - 使用 Tensorflow 的稀疏神经网络
- python - 如何将数组写入 .txt 文件,然后用相同的 .txt 文件填充数组?