FROM node:18-alpine AS builder WORKDIR /app # 安装 pnpm RUN npm install -g pnpm # 复制依赖文件 COPY package.json pnpm-lock.yaml ./ # 安装依赖 RUN pnpm install --frozen-lockfile # 复制源代码 COPY . . # 构建 RUN pnpm build # 生产阶段 FROM node:18-alpine WORKDIR /app # 安装必要工具 RUN apk add --no-cache wget && \ npm install -g pnpm # 只安装生产依赖 COPY package.json pnpm-lock.yaml ./ RUN pnpm install --prod --frozen-lockfile # 复制构建产物和必要文件 COPY --from=builder /app/dist ./dist COPY knexfile.js ./ # 创建必要的目录 RUN mkdir -p uploads database && \ chown -R node:node /app # 使用非 root 用户 USER node EXPOSE 3000 # 健康检查 HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \ CMD wget --quiet --tries=1 --spider http://localhost:3000/api/health || exit 1 CMD ["node", "dist/app.js"]