79 lines
2.5 KiB
Docker
79 lines
2.5 KiB
Docker
# =======================================================
|
||
# Global ARGs — 必须在所有 FROM 之前声明
|
||
# =======================================================
|
||
ARG NODE_BUILDER_IMAGE=node:22-bookworm
|
||
ARG NODE_RUNTIME_IMAGE=node:22-slim
|
||
ARG CONTENTLAYER_BUILD=true
|
||
|
||
# -------------------------------------------------------
|
||
# 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 git \
|
||
&& 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 && \
|
||
yarn prebuild && \
|
||
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
|
||
COPY --from=builder /app/dashboard/src/content/blog ./src/content/blog
|
||
|
||
# ---------------------------
|
||
# 额外瘦身(可减少 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"]
|