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上,镜像已做适配修改。
解决方案
确认Prisma命令的执行环境
问题核心是你在本地终端执行迁移命令,而本地无法解析Docker Compose的服务名postgres。正确操作是进入Node容器内部执行:# 替换为你的Node容器名或ID docker exec -it node sh # 容器内执行迁移 npx prisma migrate dev --name init显式指定初始化数据库
在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"优化容器启动依赖(可选)
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
相关产品推荐
相关产品推荐

