Node.js无法通过Docker连接PostgreSQL数据库的问题求助
解决本地Node.js服务无法连接Docker中PostgreSQL的问题
你遇到的getaddrinfo ENOTFOUND db错误,核心原因是本地运行的Node.js进程不在Docker Compose创建的专属网络中,无法解析Docker Compose服务名db——这个域名仅在Docker内部网络有效,本地系统的DNS无法识别它。
场景1:本地运行Node.js服务,连接Docker中的PostgreSQL
修改server.js里的数据库连接配置,将host从"db"替换为"localhost"(Docker已将PostgreSQL的5432端口映射到本地):
var pool = new Pool({ user: "postgres", host: "localhost", // 替换原"db" password: "root", port: 5432 });
修改后重新运行node server,即可通过本地映射端口访问Docker内的PostgreSQL。
场景2:通过Docker Compose一同运行服务与数据库(推荐)
如果希望服务和数据库都在Docker网络中协同运行,保持server.js里的host: "db"不变,直接执行docker compose up启动所有服务即可。此时Node服务容器与数据库容器处于同一Docker网络,能正常解析db域名,访问后会返回预期的"Tables created successfully"。
你之前的问题本质是本地单独运行Node服务,但配置使用了Docker内部的服务名,导致域名解析失败。
额外优化建议
用环境变量管理配置,避免硬编码
在docker-compose.yml的server服务中添加环境变量:services: server: build: . ports: - "8080:8080" environment: - DB_HOST=db - DB_USER=postgres - DB_PASSWORD=root - DB_PORT=5432然后在
server.js中读取环境变量,实现本地与Docker环境的自动适配:var pool = new Pool({ user: process.env.DB_USER || "postgres", host: process.env.DB_HOST || "localhost", password: process.env.DB_PASSWORD || "root", port: process.env.DB_PORT || 5432 });确保PostgreSQL就绪后再启动Node服务
在docker-compose.yml中添加健康检查配置,避免Node服务因数据库未完全启动而连接失败:services: server: build: . ports: - "8080:8080" environment: - DB_HOST=db - DB_USER=postgres - DB_PASSWORD=root - DB_PORT=5432 depends_on: db: condition: service_healthy db: image: 'postgres' ports: - '5432:5432' environment: POSTGRES_USER: 'postgres' POSTGRES_PASSWORD: 'root' healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 5s timeout: 5s retries: 5
内容的提问来源于stack exchange,提问作者wade07
相关产品推荐
相关产品推荐

