Docker容器内PG Pool无法正常工作的问题求助
问题排查与修复方案
核心原因
当服务器容器化后,localhost在容器内部指向的是服务器容器自身,而非数据库容器。之前本地运行服务器时,localhost指向宿主机,刚好数据库容器映射了宿主机的4000端口,所以能正常连接;但全容器化后,服务器容器无法通过localhost访问到数据库容器,导致数据库查询失败,最终触发404错误。
直接修复步骤
修改PG Pool的连接配置,将host从localhost改为docker-compose中定义的数据库服务名database:
const Pool = require('pg').Pool const pool = new Pool({ user: 'docker', password: 'docker', host: "database", // 替换为docker-compose里的服务名 port: 4000, database: "docker" })
Docker Compose会自动创建内部网络,服务名可直接作为DNS解析到对应容器的IP,服务器容器能通过database这个主机名访问到数据库容器。
额外优化与检查点
用环境变量解耦配置:避免硬编码数据库连接参数,在
docker-compose.yml的server服务中添加环境变量:server: build: ./server ports: - "5000:5000" environment: - DB_HOST=database - DB_PORT=4000 - DB_USER=docker - DB_PASSWORD=docker - DB_NAME=docker restart: unless-stopped然后服务器代码中读取环境变量:
const pool = new Pool({ user: process.env.DB_USER, password: process.env.DB_PASSWORD, host: process.env.DB_HOST, port: process.env.DB_PORT, database: process.env.DB_NAME })验证数据库容器状态:执行
docker-compose logs database查看日志,确认PostgreSQL正常启动,init.sql脚本执行完成,数据库docker和用户docker已正确创建。测试容器间网络连通性:进入服务器容器执行命令,测试与数据库容器的连接:
docker-compose exec server ping database # 或直接测试PostgreSQL连接 docker-compose exec server psql -h database -p 4000 -U docker -d docker优化错误处理:当前代码将数据库连接错误和用户不存在都返回404,可区分错误类型,便于排查:
router.get("/:login", async (req, res) => { try { let loginReq = JSON.parse(decodeURIComponent(req.params.login)) const user = await pool.query( "SELECT user_id,first_name,last_name,email FROM \"user\" where email = $1 and password = $2", [loginReq.email, loginReq.password] ) if(user.rows.length) { res.json(user.rows[0]) } else { res.status(404).json('User Not Found') } } catch (err) { // 数据库连接等服务器错误返回500 res.status(500).json(`Database error: ${err.message}`) } })
内容的提问来源于stack exchange,提问作者user19920364
相关产品推荐
相关产品推荐

