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初始化阶段手动创建:- 在项目根目录创建
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 - 给脚本添加执行权限:
chmod +x init-db.sh - 修改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
相关产品推荐
相关产品推荐

