Docker容器中PostgreSQL连接报错:Connection terminated unexpectedly
解决Docker PostgreSQL容器与Express/pg库连接时的"Connection terminated unexpectedly"错误
核心问题分析
你遇到的连接错误,主要是两个关键配置不匹配导致的:
- 端口映射逻辑错误:PostgreSQL默认监听容器内的
5432端口,但你的Docker命令用了-p 2345:2345,容器内的Postgres根本没在2345端口启动,外部自然无法连接。 - 数据库名称不匹配:你启动容器时未指定
POSTGRES_DB环境变量,PostgreSQL会默认创建与用户名同名的数据库admin,但代码里写的是betsdb,这个数据库并不存在。
具体解决方案
方案1:修正端口映射(推荐,使用Postgres默认端口)
修改Docker启动命令,将容器内默认的5432端口映射到主机的2345:
docker run --name postgres-container -p 2345:5432 -e POSTGRES_PASSWORD=password123 -e POSTGRES_USER=admin -e POSTGRES_DB=betsdb -d postgres
同时调整TypeScript代码,确保数据库名称正确,并且全局初始化连接池(不要在请求内重复创建):
import { Pool } from 'pg'; import { Request, Response } from 'express'; // 全局初始化连接池,复用连接资源 const pool = new Pool({ user: 'admin', host: 'localhost', database: 'betsdb', password: 'password123', port: 2345, }); app.get("/hello", async (request: Request, response: Response) => { console.log("trying connection"); try { const client = await pool.connect(); console.log("success"); client.release(); // 必须释放客户端,避免连接泄漏 response.send("Database connected successfully"); } catch (err) { console.error("Connection failed:", err); response.status(500).send("Connection error"); } });
方案2:强制让容器内Postgres运行在2345端口
如果你一定要用2345作为容器内的端口,需要通过环境变量指定Postgres的监听端口:
docker run --name postgres-container -p 2345:2345 -e POSTGRES_PASSWORD=password123 -e POSTGRES_USER=admin -e POSTGRES_DB=betsdb -e POSTGRES_PORT=2345 -d postgres
代码部分和方案1一致,保持端口为2345即可。
额外验证步骤
进入容器验证端口监听:
docker exec -it postgres-container bash # 执行后在容器内运行 netstat -tulpn | grep postgres确认输出显示Postgres监听了你指定的端口(方案1是5432,方案2是2345)。
验证数据库存在:
docker exec -it postgres-container psql -U admin -d betsdb如果能正常进入数据库交互界面,说明库已创建成功。
内容的提问来源于stack exchange,提问作者Sergio2405
相关产品推荐
相关产品推荐

