# Build stage FROM node:20-alpine AS builder WORKDIR /app # 复制依赖文件 COPY apps/web/package.json . COPY apps/web/pnpm-lock.yaml . # 如果存在 COPY pnpm-workspace.yaml . COPY package.json . # 安装 pnpm RUN npm install -g pnpm # 安装依赖 RUN pnpm install --frozen-lockfile # 复制源码 COPY apps/web . # 构建 RUN pnpm build # Production stage FROM node:20-alpine AS runner WORKDIR /app # 安装依赖(仅生产) COPY apps/web/package.json . COPY pnpm-workspace.yaml . COPY package.json . RUN npm install -g pnpm RUN pnpm install --prod --frozen-lockfile # 复制构建结果 COPY --from=builder /app/.output ./.output COPY --from=builder /app/nuxt.config.ts ./ COPY --from=builder /app/.env.example ./.env.example # 暴露端口 EXPOSE 3000 # 健康检查 HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \ CMD node -e "require('http').get('http://localhost:3000', (r) => {if(r.statusCode!==200)throw new Error(r.statusCode)})" # 启动命令 CMD ["node", ".output/server/index.mjs"]