# ============================== # 琉璃镜 · 魂镜前端镜像(Frontend / Next.js):Node 22 + pnpm # 多阶段构建:deps -> builder -> prod-deps -> runner # 启动入口:pnpm start(即 next start,默认端口 3000) # 依赖 BuildKit 的 cache mount,Docker 23+ 默认开启;旧版本需设置 DOCKER_BUILDKIT=1。 # ============================== # ---------- 基础镜像 ---------- FROM node:22-alpine AS base ENV PNPM_HOME="/pnpm" \ PATH="$PNPM_HOME:$PATH" \ NEXT_TELEMETRY_DISABLED=1 RUN corepack enable # ---------- 全量依赖(用于构建) ---------- FROM base AS deps WORKDIR /app/frontend COPY frontend/package.json frontend/pnpm-lock.yaml frontend/pnpm-workspace.yaml ./ RUN --mount=type=cache,id=pnpm,target=/pnpm/store \ pnpm install --frozen-lockfile # ---------- 构建 ---------- FROM base AS builder WORKDIR /app/frontend COPY --from=deps /app/frontend/node_modules ./node_modules COPY frontend/ ./ # 当前无 public 目录;mkdir 保证 runner 阶段 COPY 不会失败 RUN mkdir -p public \ && pnpm build # ---------- 仅生产依赖(缩小运行时镜像) ---------- FROM base AS prod-deps WORKDIR /app/frontend COPY frontend/package.json frontend/pnpm-lock.yaml frontend/pnpm-workspace.yaml ./ RUN --mount=type=cache,id=pnpm,target=/pnpm/store \ pnpm install --frozen-lockfile --prod # ---------- 运行时 ---------- FROM base AS runner WORKDIR /app/frontend ENV NODE_ENV=production COPY --from=prod-deps /app/frontend/node_modules ./node_modules COPY --from=builder /app/frontend/.next ./.next COPY --from=builder /app/frontend/public ./public COPY frontend/package.json frontend/next.config.ts ./ EXPOSE 3000 CMD ["pnpm", "start"]