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

Docker环境下Prisma创建数据库后无法连接执行迁移问题

Prisma迁移无法连接Docker内的PostgreSQL数据库

问题现象

运行包含Node应用和PostgreSQL的Docker容器(应用端口3000,数据库端口5432),执行npx prisma migrate dev --name init时出现连接错误:

Environment variables loaded from .env
Prisma schema loaded from lib/database/myschema.prisma
Datasource "db": PostgreSQL database "sales", schema "public" at "postgres:5432"

Error: P1001: Can't reach database server at `postgres`:`5432`

Please make sure your database server is running at `postgres`:`5432`.
  • 数据库已创建但无任何表生成
  • 可通过PgAdmin连接数据库并正常执行查询、创建表
  • 停止应用容器,仅保留PostgreSQL运行,将.env中DATABASE_URL改为postgresql://admin:admin@localhost:5432/sales,本地执行迁移可成功创建表

配置文件信息

schema.prisma

datasource db {
  url      = env("DATABASE_URL")
  provider = "postgresql"
}

generator client {
  provider = "prisma-client-js"
  binaryTargets = ["native", "linux-arm64-openssl-1.1.x"]
}

model Sale {
  id              Int     @id @default(autoincrement())
  saleId          Int
  uniqueSaleId    String
  createdAt       DateTime
  completedAt     DateTime
  storeId         Int
  vendorId        Int
  customerId      Int
  currency        String
  payment         String
  total           Float
  productSolds    ProductSolds[]
  accountId       String
  account         Account @relation(fields: [accountId], references: [id], onDelete: Cascade)

  @@unique([saleId, accountId])
}

model ProductSolds {
  id                 Int     @id @default(autoincrement())
  productId          Int
  productSize        Int
  quantity           Int
  productPrice       Float
  productCurrency    String
  vat                Float
  package            Int
  points             Int
  discount           Float
  stockWithdrawal    Int
  creditNote         Int
  creditNoteId       Int
  productComments    Float
  serialNumber       Float
  lineItemIdReturn   Int
  dateReturn         Int
  kitchenPos         Int
  productSupplyPrice Float
  lineItemId         Int
  detailCommandeId   Int
  saleId             Int
  sale               Sale @relation(fields: [saleId], references: [id], onDelete: Cascade)
}

model EndpointCalled{
  id         Int     @id @default(autoincrement())
  accountId  String
  year       Int
  month      Int
  day        Int
  storeId    Int
  @@unique([accountId,year,month,day,storeId])
}

model Account {
  id   String @id
  Sale Sale[]
}

.env配置

DATABASE_URL为postgresql://admin:admin@postgres:5432/sales,本地运行应用时改为localhost可正常工作。

docker-compose.yml

version: "3.7"
services:
  node:
    build:
      context: .
      dockerfile: devops/docker/dockerfiles/Dockerfile
      target: development
    volumes:
      - .:/home
      - ${GCP_SA_KEYS_PATH}:/gcp-sa-keys
    command: shell
    environment:
      adminBearerTokens: 1234
      GOOGLE_APPLICATION_CREDENTIALS: /gcp-sa-keys/${GCP_SA_KEY}
      DATABASE_URL: ${DATABASE_URL:-postgresql://admin:admin@postgres:5432/sales}
      HIBOUTIK_USER: ${HIBOUTIK_USER}
      HIBOUTIK_API_KEY: ${HIBOUTIK_API_KEY}
    depends_on:
      - postgres
    ports:
      - "3000:3000"
  postgres:
    image: postgres:14.1-alpine
    container_name: postgres
    environment:
      POSTGRES_USER: admin
      POSTGRES_PASSWORD: admin
    ports:
      - "5432:5432"

补充环境

运行在MacBook Air M1上,镜像已做适配修改。


解决方案

  1. 确认Prisma命令的执行环境
    问题核心是你在本地终端执行迁移命令,而本地无法解析Docker Compose的服务名postgres。正确操作是进入Node容器内部执行:

    # 替换为你的Node容器名或ID
    docker exec -it node sh
    # 容器内执行迁移
    npx prisma migrate dev --name init
    
  2. 显式指定初始化数据库
    在PostgreSQL容器的环境变量中添加POSTGRES_DB,自动创建目标数据库,避免初始化顺序问题:

    postgres:
      image: postgres:14.1-alpine
      container_name: postgres
      environment:
        POSTGRES_USER: admin
        POSTGRES_PASSWORD: admin
        POSTGRES_DB: sales # 新增该行
      ports:
        - "5432:5432"
    
  3. 优化容器启动依赖(可选)
    depends_on仅保证容器启动顺序,不确保数据库服务就绪。添加健康检查让Node容器等数据库完全可用后再启动:

    postgres:
      # ...其他配置
      healthcheck:
        test: ["CMD-SHELL", "pg_isready -U admin -d sales"]
        interval: 5s
        timeout: 5s
        retries: 5
    node:
      # ...其他配置
      depends_on:
        postgres:
          condition: service_healthy
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 13:01:42