# ======================================================= # Global ARGs — 必须在所有 FROM 之前声明 # ======================================================= ARG NODE_BUILDER_IMAGE=node:22-bookworm ARG NODE_RUNTIME_IMAGE=node:22-slim # ------------------------------------------------------- # Stage 1 — Builder (Turbopack + standalone) # ------------------------------------------------------- FROM ${NODE_BUILDER_IMAGE} AS builder WORKDIR /app/dashboard ENV NEXT_TELEMETRY_DISABLED=1 \ NEXT_PRIVATE_TURBOPACK=1 # --------------------------- # 基础镜像升级到最新 # --------------------------- RUN apt-get update \ && apt-get install -y --no-install-recommends curl \ && apt-get upgrade -y \ && rm -rf /var/lib/apt/lists/* \ && corepack enable \ && corepack prepare yarn@4.12.0 --activate COPY . . RUN find . -name "package-lock.json" -delete RUN yarn install --immutable RUN yarn next build # ------------------------------------------------------- # Stage 2 — Runtime (极致瘦身) # ------------------------------------------------------- FROM ${NODE_RUNTIME_IMAGE} AS runner WORKDIR /app/dashboard/ ENV NODE_ENV=production \ RUNTIME_ENV=prod \ REGION=cn \ PORT=3000 # --------------------------- # 安装 tini(修复子进程 + 更快退出) # 基础镜像升级到最新 # --------------------------- RUN apt-get update \ && apt-get install -y --no-install-recommends tini ca-certificates \ && apt-get dist-upgrade -y \ && apt-get install -y --no-install-recommends --only-upgrade libpam-modules libpam-modules-bin libpam-runtime libpam0g zlib1g \ && rm -rf /var/lib/apt/lists/* # --------------------------- # 导入 standalone 的运行产物 # --------------------------- COPY --from=builder /app/dashboard/.next/standalone ./ COPY --from=builder /app/dashboard/.next/static ./static COPY --from=builder /app/dashboard/public ./public # --------------------------- # 额外瘦身(可减少 15–40 MB) # --------------------------- #RUN rm -rf node_modules/next/dist/compiled/@vercel/og/* \ # && rm -rf node_modules/sharp/vendor/* \ # && find node_modules -name "*.md" -delete \ # && find node_modules -name "*.map" -delete # (如果 Edge Runtime 里用不到 font/SWC 也可移除,比现在更狠) EXPOSE 3000 ENTRYPOINT ["/usr/bin/tini", "--"] CMD ["node", "server.js"]