You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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这个主机名访问到数据库容器。

额外优化与检查点

  1. 用环境变量解耦配置:避免硬编码数据库连接参数,在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
    })
    
  2. 验证数据库容器状态:执行docker-compose logs database查看日志,确认PostgreSQL正常启动,init.sql脚本执行完成,数据库docker和用户docker已正确创建。

  3. 测试容器间网络连通性:进入服务器容器执行命令,测试与数据库容器的连接:

    docker-compose exec server ping database
    # 或直接测试PostgreSQL连接
    docker-compose exec server psql -h database -p 4000 -U docker -d docker
    
  4. 优化错误处理:当前代码将数据库连接错误和用户不存在都返回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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 04:02:57