# 多阶段构建 Dockerfile # 阶段1: 构建前端 FROM node:20-alpine AS frontend-builder # 设置工作目录 WORKDIR /app/web # 安装 pnpm RUN npm install -g pnpm # 复制前端 package.json 和 pnpm-lock.yaml COPY web/package.json web/pnpm-lock.yaml ./ # 复制 packages 目录(前端依赖的内部包) COPY web/packages ./packages # 安装前端依赖 RUN pnpm install # 复制前端源代码 COPY web/ . # 构建前端应用 RUN pnpm run build # 阶段2: 构建后端 FROM node:20-alpine AS backend-builder # 设置工作目录 WORKDIR /app/server # 安装 pnpm RUN npm install -g pnpm # 复制后端 package.json 和 pnpm-lock.yaml COPY server/package.json server/pnpm-lock.yaml ./ # 安装后端依赖 RUN pnpm install # 复制后端源代码 COPY server/ . # 生成 Prisma 客户端 RUN npx prisma generate # 构建后端应用 RUN pnpm run build # 阶段3: 生产环境镜像 FROM node:20-alpine AS production # 安装必要的系统依赖 RUN apk add --no-cache nginx # 设置工作目录 WORKDIR /app # 安装 pnpm RUN npm install -g pnpm # 复制后端构建产物和依赖 COPY --from=backend-builder /app/server/dist ./server/dist COPY --from=backend-builder /app/server/node_modules ./server/node_modules COPY --from=backend-builder /app/server/package.json ./server/ COPY --from=backend-builder /app/server/prisma ./server/prisma # 复制前端构建产物 COPY --from=frontend-builder /app/web/dist ./web/dist # 复制 Nginx 配置 COPY nginx.conf /etc/nginx/nginx.conf # 创建必要的目录 RUN mkdir -p /var/log/nginx /var/lib/nginx/body /var/lib/nginx/fastcgi \ && mkdir -p /app/server/upload # 创建启动脚本 RUN echo '#!/bin/sh' > /app/start.sh && \ echo 'cd /app/server' >> /app/start.sh && \ echo 'npx prisma migrate deploy' >> /app/start.sh && \ echo 'nginx -g "daemon off;" &' >> /app/start.sh && \ echo 'node dist/main.js' >> /app/start.sh && \ chmod +x /app/start.sh # 暴露端口 EXPOSE 80 6666 # 设置环境变量 ENV NODE_ENV=production # 启动应用 CMD ["/app/start.sh"]