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

Docker环境下NestJS+Prisma无法连接PostgreSQL问题求助

问题描述

通过Docker Compose部署服务集群时,NestJS+Prisma服务无法连接PostgreSQL数据库,也无法与其他服务通信。尝试将数据库地址改为localhost等操作均无效,执行docker-compose up后出现连接报错,具体报错信息如下:

cinema_1   | 
cinema_1   | > cinema@0.0.1 start:migrate:prod
cinema_1   | > prisma migrate deploy && npm run start:prod
cinema_1   | 
quotes_1   | Prisma schema loaded from prisma/schema.prisma
quotes_1   | Datasource "db": PostgreSQL database "quotes", schema "public" at "db:5432"

docker-compose配置文件如下:

version: '3.8'
services:
  gateway:
    build: ./api-gateway
    restart: always
    env_file:
      - .env
    ports:
      - "3000:3000"

  quotes:
    build: ./quotes
    restart: always
    environment:
      - DATABASE_URL=postgres://myuser:mypassword@db:5432/quotes
    ports:
      - 8895:8895

  shows:
    build: ./shows
    restart: always
    environment:
      - DATABASE_URL=postgres://myuser:mypassword@db:5432/shows
    ports:
      - 8893:8893

  db:
    image: postgres:13.5
    restart: always
    environment:
      - POSTGRES_USER=myuser
      - POSTGRES_PASSWORD=mypassword
    volumes:
      - integration-postgres:/var/lib/postgresql/data
    ports:
      - 5432:5432

volumes:
  integration-postgres:
解决方法
  • 确保数据库服务完全就绪后再启动应用
    PostgreSQL容器启动后需要时间完成初始化,直接启动Prisma服务会导致连接失败。给db服务添加健康检查,并让其他服务依赖db的健康状态:
    修改db服务配置:

    db:
      image: postgres:13.5
      restart: always
      environment:
        - POSTGRES_USER=myuser
        - POSTGRES_PASSWORD=mypassword
      volumes:
        - integration-postgres:/var/lib/postgresql/data
      ports:
        - 5432:5432
      healthcheck:
        test: ["CMD-SHELL", "pg_isready -U myuser -d postgres"]
        interval: 5s
        timeout: 5s
        retries: 5
    

    然后在quotes、shows、gateway服务中添加依赖配置:

    quotes:
      build: ./quotes
      restart: always
      environment:
        - DATABASE_URL=postgres://myuser:mypassword@db:5432/quotes
      ports:
        - 8895:8895
      depends_on:
        db:
          condition: service_healthy
    
  • 自动创建所需的PostgreSQL数据库
    PostgreSQL默认不会自动创建quotes和shows数据库,需要在db初始化阶段手动创建:

    1. 在项目根目录创建init-db.sh脚本:
      #!/bin/bash
      set -e
      
      psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
          CREATE DATABASE quotes;
          CREATE DATABASE shows;
      EOSQL
      
    2. 给脚本添加执行权限:chmod +x init-db.sh
    3. 修改db服务的volumes配置,挂载脚本到初始化目录:
      db:
        # ...其他配置
        volumes:
          - integration-postgres:/var/lib/postgresql/data
          - ./init-db.sh:/docker-entrypoint-initdb.d/init-db.sh
      
  • 给Prisma迁移添加重试机制
    即使依赖了健康检查,仍可能出现连接延迟。修改quotes和shows服务的启动命令(在各自的Dockerfile中):

    CMD until npx prisma migrate deploy; do echo "Waiting for db..."; sleep 2; done && npm run start:prod
    
  • 统一服务网络配置
    Docker Compose默认会创建共享网络,但明确指定网络可避免潜在问题。在docker-compose.yml中添加自定义网络:

    version: '3.8'
    services:
      gateway:
        # ...其他配置
        networks:
          - app-network
      quotes:
        # ...其他配置
        networks:
          - app-network
      shows:
        # ...其他配置
        networks:
          - app-network
      db:
        # ...其他配置
        networks:
          - app-network
    
    networks:
      app-network:
        driver: bridge
    

内容的提问来源于stack exchange,提问作者Ignace Mella

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 13:31:12