You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何减小Next.js应用的Docker镜像体积?

优化Next.js Docker镜像体积的方案

从你提供的Dockerfile和镜像历史来看,核心体积开销来自node_modules(1.28GB)、.next构建产物(814MB)以及基础镜像本身,以下是针对性的优化手段:

1. 精简Builder阶段的依赖,剔除Dev依赖

你的Builder阶段执行了全量npm install,即便已移除无用依赖,仍可能包含开发阶段才需要的依赖。可修改安装逻辑:

  • 若构建过程不需要Dev依赖:
RUN npm ci --only=production
  • 若构建必须依赖Dev依赖(比如Next.js编译需要babel等),则在构建完成后清理:
RUN npm install \
    && npm prune --production

同时,Builder阶段安装的系统工具(python3、make、g++等)仅用于构建,不需要保留,用虚拟包分组后清理:

RUN apk add --no-cache --virtual .build-deps python3 make g++ gcc fftw-dev libc6-compat \
    && apk add --no-cache --repository http://dl-3.alpinelinux.org/alpine/edge/testing vips-dev \
    && npm install \
    && npm i sharp \
    && npm prune --production \
    && apk del .build-deps

2. 替换生产阶段的基础镜像为极简版本

node:18-alpine自带npm、yarn等工具,生产环境仅需node运行时,可改用更精简的镜像:

  • 用node:18-alpine-slim:保留alpine特性,砍掉非必要工具
  • 用gcr.io/distroless/nodejs18-debian12:仅包含node运行时,体积极致精简

若选用distroless镜像,需调整启动命令(跳过npm直接启动node服务):

CMD ["node", ".next/standalone/server.js"]

3. 启用Next.js Standalone模式

Next.js的Standalone模式会构建出仅包含运行必需文件的独立包,大幅削减.next和node_modules的冗余内容。先在next.config.js中开启:

/** @type {import('next').NextConfig} */
const nextConfig = {
  output: 'standalone',
}

module.exports = nextConfig

再修改Dockerfile的复制逻辑,只复制必要产物:

# 生产阶段仅复制standalone包和静态资源
COPY --from=builder /app/.next/standalone ./
COPY --from=builder /app/.next/static ./.next/static
COPY --from=builder /app/public ./public

此方式可避免复制完整的node_modules和庞大的.next目录。

4. 清理冗余文件与合并镜像层

  • 不要将.env文件复制到镜像中,建议通过Docker环境变量或密钥管理传递敏感配置,同时减少镜像体积。
  • 检查data目录,仅复制生产必需的文件,剔除测试/临时数据。
  • 合并多个COPY/RUN命令,减少镜像层数并避免临时文件残留:
# 合并生产阶段的复制命令
COPY --from=builder /app/.next/standalone ./ \
    --from=builder /app/.next/static ./.next/static \
    --from=builder /app/public ./public \
    --from=builder /app/data ./data

优化后的完整Dockerfile示例

FROM node:18-alpine AS builder

WORKDIR /app

COPY src/package*.json ./

# 安装构建依赖后清理
RUN apk add --no-cache --virtual .build-deps python3 make g++ gcc fftw-dev libc6-compat \
    && apk add --no-cache --repository http://dl-3.alpinelinux.org/alpine/edge/testing vips-dev \
    && npm install \
    && npm i sharp \
    && npm prune --production \
    && apk del .build-deps

COPY src/. .

# 启用standalone模式构建
RUN npm run build

# 使用精简基础镜像
FROM node:18-alpine-slim

WORKDIR /app

# 复制必要构建产物
COPY --from=builder /app/.next/standalone ./
COPY --from=builder /app/.next/static ./.next/static
COPY --from=builder /app/public ./public
COPY --from=builder /app/data ./data

ENV NODE_ENV production
ENV PORT 3000
ENV NEXT_SHARP_PATH /tmp/node_modules/sharp

EXPOSE 3000

# 直接启动node服务
CMD ["node", "server.js"]

内容的提问来源于stack exchange,提问作者Numan Burak Fidan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 20:53:29