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
相关产品推荐
相关产品推荐

