我有这个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重新创建网络,我尝试分别为服务指定expose
和links
。一切都没有成功。
如果您想复制问题,我在这里设置了一个示例存储库: https://github.com/afifsohaili/demo-dockercompose-network
任何帮助将不胜感激!谢谢!
答案 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