# 构建阶段 FROM node:20-alpine AS builder # 设置工作目录 WORKDIR /app # 复制 package.json 和 pnpm-lock.yaml(如果有的话) COPY package.json pnpm-lock.yaml* ./ # 安装 pnpm RUN npm install -g pnpm # 安装依赖 RUN pnpm install --frozen-lockfile # 生产阶段 FROM node:20-alpine AS production # 安装必要的系统依赖 RUN apk add --no-cache dumb-init # 创建非 root 用户 RUN addgroup -g 1001 -S nodejs && \ adduser -S nodejs -u 1001 # 设置工作目录 WORKDIR /app # 从构建阶段复制依赖 COPY --from=builder /app/node_modules ./node_modules # 复制应用代码 COPY --chown=nodejs:nodejs . . # 切换到非 root 用户 USER nodejs # 暴露端口(如果有需要) # EXPOSE 3000 # 使用 dumb-init 处理信号 ENTRYPOINT ["dumb-init", "--"] # 启动应用 CMD ["node", "index.js"] # 健康检查 HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ CMD node -e "console.log('healthy')" || exit 1