# 使用官方 Node.js 22 Alpine 镜像作为基础镜像 FROM node:22-alpine AS base # 构建参数 ARG GIT_COMMIT="" ARG GIT_BRANCH="" ARG BUILD_TIME="" # 设置环境变量 ENV GIT_COMMIT=$GIT_COMMIT ENV GIT_BRANCH=$GIT_BRANCH ENV BUILD_TIME=$BUILD_TIME # 设置工作目录 WORKDIR /app # 复制 package.json 和 pnpm-lock.yaml COPY package.json pnpm-lock.yaml ./ # 安装 pnpm 并安装生产依赖 RUN npm install -g pnpm && pnpm install --prod --frozen-lockfile # 构建阶段 FROM base AS build # 安装所有依赖(包括开发依赖) RUN pnpm install --frozen-lockfile # 复制源代码 COPY . . # 构建应用 RUN pnpm run build # 生产阶段 FROM node:22-alpine AS production # 设置环境变量 ENV NODE_ENV=production # 创建非root用户 RUN addgroup -g 1001 -S nodejs RUN adduser -S nestjs -u 1001 # 设置工作目录 WORKDIR /app # 复制 package.json 和 pnpm-lock.yaml COPY package.json pnpm-lock.yaml ./ # 安装 pnpm 并安装生产依赖 RUN npm install -g pnpm && pnpm install --prod --frozen-lockfile # 从构建阶段复制构建产物 COPY --from=build --chown=nestjs:nodejs /app/dist ./dist # 切换到非root用户 USER nestjs # 暴露端口 EXPOSE 3000 # 健康检查 HEALTHCHECK --interval=30s --timeout=10s --start-period=30s --retries=3 \ CMD wget --no-verbose --tries=1 --spider http://localhost:3000/health || exit 1 # 启动应用 CMD ["node", "dist/src/main"]