Docker容器中Prisma迁移PostgreSQL数据库失败求助
解决Docker Compose下Prisma Migrate无法连接PostgreSQL的P1001错误
问题背景
本地未使用Docker时,Prisma模型迁移正常;部署Docker Compose后执行npx prisma migrate dev --name init命令,出现P1001错误,提示无法连接到db:5432数据库服务器。
核心原因
- 主机名解析限制:
db是Docker Compose定义的服务名,仅在Docker内部网络(my_network)中可被识别。直接在本地主机执行迁移命令时,本地系统无法解析db这个主机名,导致连接失败。 - 数据库就绪延迟:
depends_on仅保证服务启动顺序,不等待PostgreSQL完成初始化(如创建数据库、启动服务进程),即使db容器启动,数据库可能仍未就绪。
解决方案
方案一:本地执行迁移,修改连接地址
本地主机访问Docker中的PostgreSQL,需使用映射到本地的端口和localhost作为主机名,修改.env文件:
DATABASE_URL=postgresql://postgres:password@localhost:5432/db
确保db服务已启动(执行docker compose up -d db),再重新运行迁移命令:
npx prisma migrate dev --name init
方案二:在Docker容器内部执行迁移
利用Docker内部网络的服务名解析能力,直接在backend容器内执行迁移:
docker compose run backend npx prisma migrate dev --name init
此命令会临时启动backend容器,容器内的.env配置(db:5432)可正常解析到db服务。
额外优化:确保数据库完全就绪
为避免因PostgreSQL未初始化完成导致的连接失败,给db服务添加健康检查,并让backend服务等待db就绪后再启动:
修改docker-compose.yml中的db服务配置:
db: image: postgres:latest environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: password POSTGRES_DB: db ports: - '5432:5432' volumes: - ./postgres-data:/var/lib/postgresql/data networks: - my_network healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres -d db"] interval: 5s timeout: 5s retries: 5
同时修改backend服务的depends_on:
backend: build: ./backend ports: - '5001:5001' depends_on: db: condition: service_healthy networks: - my_network
内容的提问来源于stack exchange,提问作者Сулейман Хасанов
相关产品推荐
相关产品推荐

