发布于 2026-01-06 9 阅读
0

减小 Next.js 应用的 Docker 镜像大小

减小 Next.js 应用的 Docker 镜像大小

介绍

首先,我假设您知道 Docker 是什么,但如果您不知道:

Docker 是一个用于开发、交付和运行应用程序的开放平台。

你可以花时间了解它。

另一方面,NextJS 是一个灵活的 React 框架,它提供了构建模块,可用于创建快速的 Web 应用程序。

另一方面,NextJS 是一个灵活的 React 框架,它提供了构建模块,可用于创建快速的 Web 应用程序。

将您的应用程序容器化

在进行任何优化之前,我们必须先将应用程序容器化。假设我们的应用程序名称是my-space。从以下代码开始:

创建Dockerfile



touch Dockerfile


Enter fullscreen mode Exit fullscreen mode

忽略以下位置的不必要文件dockerignore



node_modules
.next
.vscode
.gitignore
README.md
.dockerignore
.git


Enter fullscreen mode Exit fullscreen mode

将其容器化:

图片描述

这是应用容器化的最基本示例,现在让我们用以下命令构建它:



docker build -t my-space .


Enter fullscreen mode Exit fullscreen mode

现在看看尺寸:

图片描述

也太夸张了吧,居然要2.42GB
!!

难以置信吧,我们无法发布这张图片,它太大了!

减小图像尺寸

使用高山

Node.js Docker 团队维护着一个node:alpine镜像标签及其变体,用于将特定版本的 Alpine Linux 发行版与 Node.js 运行时环境相匹配。原始版本的大小约为 1GB。

现在我们来看高山版本:

图片描述

图片描述

现在文件大小缩小到了1.65GB,少了800MB。这真是一个好的开始!

多阶段构建

对于任何努力优化 Dockerfile 并使其易于阅读和维护的人来说,多阶段构建都非常有用。

我们将创建两个阶段Dockerfile。我将其称为“builder和”。runner

这样我们就可以去除图像中不必要的文件:

图片描述

我们将从该文件中选取文件builder,并将其移动到runner我们最终要使用的文件目录中:

图片描述

*文件大小降至 1.36GB,减少了约 300MB,我们做得很好!
*

移除重复图层

您可以看到存在重复安装的情况。是的,我们为每个阶段都安装了两次依赖项。虽然这样做可以正常工作,项目大小也保持不变,但由于缓存和图层的存在,图像大小仍然很大。

node_modules因此,我们可以从构建阶段选择:

图片描述

图片描述

对于一个 NextJS 应用来说,现在的大小相当不错,不到 500MB。

但我们仍然可以让它更轻!

输出文件跟踪

在构建过程中,Next.js它会自动跟踪每个页面及其依赖项,以确定部署应用程序生产版本所需的所有文件。

此功能有助于大幅减小部署包的大小。以前,使用 Docker 部署时,需要安装软件包依赖项中的所有文件才能运行next start。从 Next.js 12 开始,您可以利用.next/目录中的输出文件跟踪功能,仅包含必要的文件。

在您的next.config.js文件中,启用独立输出



experimental: {
    outputStandalone: true,
  },


Enter fullscreen mode Exit fullscreen mode

这将创建一个文件夹,.next/standalone然后可以单独部署该文件夹而无需安装node_modules

图片描述

图片描述

*文件大小现在只有 176MB!对于大多数情况来说足够小了

结论

这只是一个简单的优化 Docker 镜像大小的示例,您可以深入研究 Docker 文档,找到最适合您应用程序的处理方法!

文章来源:https://dev.to/leduc1901/reduce-docker-image-size-for-your-nextjs-app-5911