# 构建阶段 FROM node:20-alpine AS builder # 设置工作目录 WORKDIR /app # 复制package.json和package-lock.json COPY package*.json ./ # 安装依赖(包括devDependencies,因为需要typescript等构建工具) RUN npm ci --only=production --ignore-scripts && \ npm ci --only=development --ignore-scripts # 复制源代码 COPY . . # 构建TypeScript RUN npm run build # 运行时阶段 FROM node:20-alpine AS runtime # 设置工作目录 WORKDIR /app # 创建非root用户 RUN addgroup -g 1001 -S nodejs && \ adduser -S nodejs -u 1001 -G nodejs # 复制package.json COPY --from=builder --chown=nodejs:nodejs /app/package*.json ./ # 安装仅生产依赖 RUN npm ci --only=production --ignore-scripts # 复制构建产物 COPY --from=builder --chown=nodejs:nodejs /app/dist ./dist # 复制可能需要的其他文件(如数据库初始化脚本) COPY --from=builder --chown=nodejs:nodejs /app/src/db ./src/db # 切换用户 USER nodejs # 暴露端口(默认3001,可通过环境变量覆盖) EXPOSE 3001 # 健康检查 HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ CMD node -e "require('http').get('http://localhost:3001/health', (r) => {if(r.statusCode===200)process.exit(0);process.exit(1)}).on('error',()=>process.exit(1))" # 启动命令 CMD ["npm", "start"]