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

Docker容器中Prisma迁移PostgreSQL数据库失败求助

解决Docker Compose下Prisma Migrate无法连接PostgreSQL的P1001错误

问题背景

本地未使用Docker时,Prisma模型迁移正常;部署Docker Compose后执行npx prisma migrate dev --name init命令,出现P1001错误,提示无法连接到db:5432数据库服务器。

核心原因

  1. 主机名解析限制:db是Docker Compose定义的服务名,仅在Docker内部网络(my_network)中可被识别。直接在本地主机执行迁移命令时,本地系统无法解析db这个主机名,导致连接失败。
  2. 数据库就绪延迟: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,提问作者Сулейман Хасанов

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 00:32:45