# 多阶段构建 - 构建阶段 FROM node:18-alpine AS builder WORKDIR /app # 安装构建依赖 RUN apk add --no-cache libc6-compat # 复制package文件 COPY package*.json ./ COPY pnpm-lock.yaml ./ # 安装pnpm RUN npm install -g pnpm # 安装依赖 RUN pnpm install --frozen-lockfile # 复制源代码 COPY . . # 设置环境变量 ENV NEXT_TELEMETRY_DISABLED 1 ENV NODE_ENV production # 构建应用 RUN pnpm build # 生产阶段 FROM node:18-alpine AS runner WORKDIR /app # 安装运行时依赖 RUN apk add --no-cache \ curl \ dumb-init \ && rm -rf /var/cache/apk/* # 创建非root用户 RUN addgroup -g 1001 -S nodejs && \ adduser -S nextjs -u 1001 -G nodejs # 复制构建产物 COPY --from=builder /app/public ./public COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static # 设置环境变量 ENV NODE_ENV production ENV NEXT_TELEMETRY_DISABLED 1 ENV PORT 3000 ENV HOSTNAME "0.0.0.0" USER nextjs # 暴露端口 EXPOSE 3000 # 健康检查 HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \ CMD curl -f http://localhost:3000/api/health || exit 1 # 使用dumb-init作为PID 1 ENTRYPOINT ["dumb-init", "--"] # 启动应用 CMD ["node", "server.js"]