# 多阶段构建 FROM node:20-alpine AS builder WORKDIR /app # 安装构建依赖 RUN apk add --no-cache openssl python3 make g++ # 先复制 Prisma schema COPY prisma ./prisma # 复制 package 文件 COPY package*.json ./ # 安装依赖 RUN npm ci --ignore-scripts # 生成 Prisma Client RUN npx prisma generate # 复制源代码 COPY . . # 设置生产环境变量(与运行阶段一致) ENV DATABASE_URL="file:/app/data/student.db" RUN mkdir -p /app/data && chmod 777 /app/data # 构建 Nuxt RUN npm run build # 在构建阶段创建数据库 RUN npx prisma db push # 生产镜像 FROM node:20-alpine WORKDIR /app # 安装运行时依赖 RUN apk add --no-cache openssl # 创建数据目录 RUN mkdir -p /app/data && chmod 777 /app/data # 设置数据库环境变量 ENV DATABASE_URL="file:/app/data/student.db" # 复制 node_modules COPY --from=builder /app/node_modules ./node_modules # 复制 Prisma schema 和生成的 Client COPY --from=builder /app/prisma ./prisma COPY --from=builder /app/node_modules/.prisma ./node_modules/.prisma # 复制 package.json COPY --from=builder /app/package.json ./ # 复制构建产物 COPY --from=builder /app/.output ./ # 复制构建阶段创建的数据库文件 COPY --from=builder /app/data/student.db /app/data/student.db # 暴露端口 EXPOSE 3000 # 启动应用 CMD ["node", "server/index.mjs"]