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

Docker部署Next.js+Prisma+MySQL:数据库已创建但表未生成求助

问题:Docker部署Next.js+Prisma+MySQL时数据库已创建但表未生成

我正在学习Docker,尝试部署Next.js + Prisma + MySQL全栈项目。执行docker compose up后,数据库已成功创建,但Prisma未生成任何表。以下是相关配置文件:

Dockerfile

FROM node

WORKDIR /app

COPY package*.json ./
COPY prisma ./prisma

RUN npm install 
RUN npx prisma generate && npx prisma db push

COPY . .

EXPOSE 3000

CMD npm run dev

compose.yml

version: '3.8'

services:
  frontend:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - 3000:3000
    develop:
      watch:
        - path: ./package.json
          action: rebuild
        - path: ./next.config.js
          action: rebuild
        - path: './package-lock.json'
          action: rebuild
        - path: .
          target: /app
          action: sync
    environment:
      - NODE_ENV=development
      - DATABASE_URL=mysql://root:admin@db:3307/next-sched
    depends_on:
            db:
                condition: service_healthy
    volumes:
      - .:/app
      - /app/node_modules
      - /app/.next

  db:
    image: mysql:8.0
    ports:
      - 3307:3306
    environment:
      - MYSQL_ROOT=root
      - MYSQL_ROOT_PASSWORD=admin
      - MYSQL_DATABASE=next-sched
    volumes:
      - mysql-data:/var/lib/mysql
    healthcheck:
        test: ["CMD", "mysqladmin" ,"ping", "-h", "db"]
        timeout: 20s
        retries: 10
    restart: unless-stopped

volumes:
  mysql-data:

.env

DATABASE_URL="mysql://root:admin@localhost:3307/next-sched"

schema.prisma

generator client {
  provider = "prisma-client-js"
}

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

//the rest of code

package.json

{
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start",
"lint": "next lint",
"postinstall": "prisma generate"
},
}

核心问题分析

  • 构建阶段无法访问数据库:Dockerfile中的RUN npx prisma db push在镜像构建阶段执行,此时Docker Compose的db服务尚未启动,无法建立数据库连接,导致表创建操作失败。
  • DATABASE_URL端口配置错误:compose中frontend服务的DATABASE_URL使用了db:3307,但db容器内部的MySQL默认端口是3306,3307是宿主机的映射端口,容器内部应使用3306。
  • 模型定义缺失:如果schema.prisma中没有实际的数据表模型(仅保留了generator和datasource部分),Prisma不会生成任何表。

解决方案

1. 迁移数据库操作到容器启动阶段

修改Dockerfile,将prisma db push从构建阶段移到启动命令中,确保执行时数据库已就绪:

FROM node

WORKDIR /app

COPY package*.json ./
COPY prisma ./prisma

RUN npm install 
RUN npx prisma generate

COPY . .

EXPOSE 3000

CMD ["sh", "-c", "npx prisma db push && npm run dev"]

2. 修正DATABASE_URL端口配置

更新compose.yml中frontend服务的环境变量,使用容器内部端口3306:

environment:
  - NODE_ENV=development
  - DATABASE_URL=mysql://root:admin@db:3306/next-sched

3. 确保schema.prisma包含数据表模型

检查schema.prisma,添加至少一个数据表模型,例如:

model Task {
  id          Int      @id @default(autoincrement())
  title       String
  description String?
  createdAt   DateTime @default(now())
}

4. 查看日志排查错误

执行以下命令查看frontend容器的运行日志,确认prisma db push的执行状态和具体错误:

docker compose logs frontend

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 22:53:19