Postgres ECONNREFUSED 在 Docker Compose 上使用 NodeJS [重复]
Posted
技术标签:
【中文标题】Postgres ECONNREFUSED 在 Docker Compose 上使用 NodeJS [重复]【英文标题】:Postgres ECONNREFUSED on Docker Compose with NodeJS [duplicate] 【发布时间】:2020-02-03 14:53:00 【问题描述】:当我通过 docker-compose 运行时尝试从 docker 中的 NodeJS 应用程序连接到 docker 中的 postgres 服务器时收到 ECONNREFUSED。但是我可以从我的主机连接。这是我的 docker-compose.yml:
version: "2.4"
services:
api:
build:
context: .
target: dev
depends_on:
- postgres
ports:
- "8080:8080"
- "9229:9229"
networks:
- backend
environment:
- NODE_ENV=development
- PGHOST=postgres
- PGPASSWORD=12345678
- PGUSER=test
- PGDATABASE=test
- PGPORT=5433
volumes:
- .:/node/app
- /node/app/node_modules # Use empty volume to hide the node_modules from the host os
postgres:
image: postgres:11
restart: always
ports:
- "5433:5432"
networks:
- backend
volumes:
- db-data:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: 12345678
POSTGRES_USER: test
POSTGRES_DB: test
networks:
backend:
volumes:
db-data:
nodeJS代码:
const client = new Client(
user: process.env.PGUSER,
host: process.env.PGHOST,
database: process.env.PGDATABASE,
password: process.env.PGPASSWORD,
port: Number(process.env.PGPORT),
);
client.connect();
错误:
Error: connect ECONNREFUSED 172.22.0.2:5433
api_1 | at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1106:14)
api_1 | errno: 'ECONNREFUSED',
api_1 | code: 'ECONNREFUSED',
api_1 | syscall: 'connect',
api_1 | address: '172.22.0.2',
api_1 | port: 5433
同时,我可以毫无问题地从主机操作系统连接到数据库服务器。网络有问题吗?
编辑:在 nodejs 应用程序尝试之前,dB 服务器已准备好接受连接(我也尝试从 nodejs 应用程序内重试连接)。
【问题讨论】:
【参考方案1】:不,网络没有任何问题。只是因为你连接到了错误的端口。
在 compose 网络中,您的 postgres
容器暴露了 5432
端口,因此它只接受来自 compose 网络中该端口的请求。所以只需要把PGPORT=5433
改成PGPORT=5432
即可。
您可以从您的主机操作系统访问的原因是因为 docker-compose 映射了您的端口 5433:5432
,因此所有从外部(主机操作系统)对 5433
的请求都将传递给您的 compose 网络内的 5432
。
希望足够清楚,以便您解决问题。
【讨论】:
以上是关于Postgres ECONNREFUSED 在 Docker Compose 上使用 NodeJS [重复]的主要内容,如果未能解决你的问题,请参考以下文章
本地主机中的节点 postgres ECONNREFUSED
docker-compose ECONNREFUSED 用于 nodeJS 上的 Postgres
(在localhost上连接到Redis时出错:6379(Errno :: ECONNREFUSED)):
如何在 docker 中从一个容器获取数据到另一个容器?我收到 ECONNREFUSED 错误
在应用程序中发出 GET 请求时 ECONNREFUSED,但 API 成功返回 JSON
未处理的拒绝SequelizeConnectionRefusedError:将ECONNREFUSED 127.0.0.1:5432与docker连接起来