如何用Docker Compose部署Next.js+Prisma+SQLite应用?
解决Next.js 14 + Prisma + SQLite Docker Compose部署的Prisma Client初始化错误
问题根源
你的部署问题来自两个核心错误:
- Dockerfile步骤顺序错误:
prisma generate在npm install之前执行,此时依赖尚未安装,无法生成Prisma Client。 - Docker Compose卷挂载配置不当:挂载规则导致容器内的Prisma生成文件或依赖被本地目录覆盖。
修正Dockerfile
调整步骤顺序,确保先安装依赖再生成Prisma Client,同时优化权限处理:
# 基础镜像 FROM node:20-alpine # 创建非root用户降低安全风险 RUN addgroup app && adduser -S -G app app WORKDIR /app # 先复制package文件,利用Docker缓存 COPY package*.json ./ # 切换root安装依赖(避免权限问题) USER root RUN npm install # 修正文件所有权 RUN chown -R app:app . USER app # 复制prisma目录和项目代码 COPY ./prisma ./prisma COPY . . # 生成Prisma Client(此时依赖已安装) RUN npx prisma generate EXPOSE 3000 # 启动开发服务器 CMD ["npm", "run", "dev"]
修正Docker Compose配置
调整卷挂载规则,确保本地代码同步的同时,保留容器内的node_modules和Prisma生成文件,同时同步SQLite数据库:
version: "3.9" services: web: build: context: . environment: DATABASE_URL: file:./prisma/dev.db ports: - "3000:3000" volumes: # 挂载本地项目目录到容器 - .:/app # 保留容器内的node_modules,避免本地依赖覆盖 - /app/node_modules # 单独同步SQLite数据库和迁移文件,确保数据一致性 - ./prisma/dev.db:/app/prisma/dev.db - ./prisma/migrations:/app/prisma/migrations
额外优化步骤
- 添加
.dockerignore文件:避免将本地冗余文件复制到镜像,减少体积并避免冲突:node_modules .next npm-debug.log - 重新构建镜像:执行
docker compose build --no-cache清除旧缓存,确保新配置生效。 - 启动容器并验证:执行
docker compose up,通过以下命令查看容器日志确认无错误:docker compose logs web
内容的提问来源于stack exchange,提问作者CodeConnoisseur
相关产品推荐
相关产品推荐

