# --- 依赖安装阶段 (deps) --- # 使用一个包含完整构建工具的 Node.js 镜像 FROM node:22-alpine AS deps ENV VERSION 1.0.0 WORKDIR /app # 复制 package.json 和 lock 文件 COPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml* ./ # 安装依赖 # 使用 --frozen-lockfile 确保使用 lock 文件中的确切依赖版本 RUN \ if [ -f yarn.lock ]; then yarn install --frozen-lockfile; \ elif [ -f package-lock.json ]; then npm ci; \ elif [ -f pnpm-lock.yaml ]; then yarn global add pnpm && pnpm i --frozen-lockfile; \ else echo "Lockfile not found." && exit 1; \ fi # --- 构建阶段 (builder) --- # 使用与上一阶段相同的镜像 FROM node:22-alpine AS builder WORKDIR /app # 从上一阶段复制依赖 COPY --from=deps /app/node_modules ./node_modules # 复制所有项目文件 COPY . . # 构建 Next.js 应用 RUN npm run build # --- 运行阶段 (runner) --- # 使用一个更小、更安全的 Node.js 镜像 FROM node:22-alpine AS runner WORKDIR /app # 设置生产环境变量 ENV NODE_ENV=production # 如果你的应用在非根路径下运行,可以设置这个环境变量 # ENV NEXT_TELEMETRY_DISABLED 1 # 创建一个非 root 用户来运行应用,增强安全性 RUN addgroup --system --gid 1001 nodejs RUN adduser --system --uid 1001 nextjs # 从构建阶段复制独立输出的文件夹 COPY --from=builder /app/.next/standalone ./ # 复制 public 和 .next/static 文件夹 # standalone 模式下,这些静态资源也需要被复制 COPY --from=builder /app/public ./public COPY --from=builder /app/.next/static ./.next/static # 更改文件所有权为新创建的用户 RUN chown -R nextjs:nodejs . # 切换到新用户 USER nextjs # 暴露端口 # Hugging Face Spaces 默认会将流量路由到 7860 端口,但我们可以在 README 中配置 EXPOSE 3000 # 设置 HOSTNAME,以便 Next.js 服务能正确监听所有网络接口 ENV HOSTNAME "0.0.0.0" # 设置 PORT,Hugging Face 会自动映射 ENV PORT 3000 # 启动应用的命令 CMD ["node", "server.js"]