# 使用官方基础镜像,指定版本以提高可重复性 FROM node:18-alpine AS builder # 设置工作目录 WORKDIR /app # 设置环境变量 ENV NODE_ENV=production \ PORT=3000 # 安装构建依赖 COPY package*.json ./ RUN npm ci --only=production # 复制源代码 COPY . . # 构建应用(如果是需要构建的项目) # RUN npm run build # ========== 生产阶段 ========== FROM node:18-alpine # 创建非root用户以提高安全性 RUN addgroup -g 1001 -S nodejs && \ adduser -S nodejs -u 1001 WORKDIR /app # 从构建阶段复制必要文件 COPY --from=builder --chown=nodejs:nodejs /app/package*.json ./ COPY --from=builder --chown=nodejs:nodejs /app/node_modules ./node_modules COPY --from=builder --chown=nodejs:nodejs /app ./ # 切换到非root用户 USER nodejs # 健康检查 HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ CMD node -e "require('http').get('http://localhost:${PORT}/health', (r) => {if(r.statusCode !== 200) throw new Error()})" || exit 1 # 暴露端口 EXPOSE 3000 # 启动命令 CMD ["node", "server.js"]