Dockerfile 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. # 多阶段构建 Dockerfile
  2. # 阶段1: 构建前端
  3. FROM node:20-alpine AS frontend-builder
  4. # 设置工作目录
  5. WORKDIR /app/web
  6. # 安装 pnpm
  7. RUN npm install -g pnpm
  8. # 复制前端 package.json 和 pnpm-lock.yaml
  9. COPY web/package.json web/pnpm-lock.yaml ./
  10. # 复制 packages 目录(前端依赖的内部包)
  11. COPY web/packages ./packages
  12. # 安装前端依赖
  13. RUN pnpm install
  14. # 复制前端源代码
  15. COPY web/ .
  16. # 构建前端应用
  17. RUN pnpm run build
  18. # 阶段2: 构建后端
  19. FROM node:20-alpine AS backend-builder
  20. # 设置工作目录
  21. WORKDIR /app/server
  22. # 安装 pnpm
  23. RUN npm install -g pnpm
  24. # 复制后端 package.json 和 pnpm-lock.yaml
  25. COPY server/package.json server/pnpm-lock.yaml ./
  26. # 安装后端依赖
  27. RUN pnpm install
  28. # 复制后端源代码
  29. COPY server/ .
  30. # 生成 Prisma 客户端
  31. RUN npx prisma generate
  32. # 构建后端应用
  33. RUN pnpm run build
  34. # 阶段3: 生产环境镜像
  35. FROM node:20-alpine AS production
  36. # 安装必要的系统依赖
  37. RUN apk add --no-cache nginx
  38. # 设置工作目录
  39. WORKDIR /app
  40. # 安装 pnpm
  41. RUN npm install -g pnpm
  42. # 复制后端构建产物和依赖
  43. COPY --from=backend-builder /app/server/dist ./server/dist
  44. COPY --from=backend-builder /app/server/node_modules ./server/node_modules
  45. COPY --from=backend-builder /app/server/package.json ./server/
  46. COPY --from=backend-builder /app/server/prisma ./server/prisma
  47. # 复制前端构建产物
  48. COPY --from=frontend-builder /app/web/dist ./web/dist
  49. # 复制 Nginx 配置
  50. COPY nginx.conf /etc/nginx/nginx.conf
  51. # 创建必要的目录
  52. RUN mkdir -p /var/log/nginx /var/lib/nginx/body /var/lib/nginx/fastcgi \
  53. && mkdir -p /app/server/upload
  54. # 创建启动脚本
  55. RUN echo '#!/bin/sh' > /app/start.sh && \
  56. echo 'cd /app/server' >> /app/start.sh && \
  57. echo 'npx prisma migrate deploy' >> /app/start.sh && \
  58. echo 'nginx -g "daemon off;" &' >> /app/start.sh && \
  59. echo 'node dist/main.js' >> /app/start.sh && \
  60. chmod +x /app/start.sh
  61. # 暴露端口
  62. EXPOSE 80 6666
  63. # 设置环境变量
  64. ENV NODE_ENV=production
  65. # 启动应用
  66. CMD ["/app/start.sh"]