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 重新创建网络,我试过分别为服务指定 expose
和 links
。一切都没有成功。
如果你想尝试重现这个问题,我已经在这里建立了一个样本仓库:
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
我有这个 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 重新创建网络,我试过分别为服务指定 expose
和 links
。一切都没有成功。
如果你想尝试重现这个问题,我已经在这里建立了一个样本仓库: 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