介绍
Docker 近年来因允许将应用程序放置在容器内而受到欢迎。这些容器可以部署到任何环境,并且在所有环境中都以相同的方式工作,无论应用程序运行的平台如何,都提供统一行为。这些容器使用图像,它们是应用程序的副本或压缩快照。通过将它们放置在容器中,它们将完全按原样显示。这是一些人迫切需要的技术之一,而另一些人直到听说它才意识到他们需要它。
就其本身而言,Next.js 是最流行的 React 框架。与使用 webpack 或 Vite 等捆绑器的任何其他 JavaScript 应用程序一样,使用项目的编译版本进行生产。这称为构建。构建旨在提供应用程序所需的最少量代码,使其与开发中的功能相同。这确保了 JavaScript 文件非常轻量级,允许浏览器在尽可能短的时间内获取和解释它们,以呈现用户界面或执行应用程序所需的任何任务。”
Next.js 特别提供了一个进一步减小构建大小的版本:独立构建。如果我们使用 Docker 为 Next.js 应用程序创建映像,我们可以轻松地将我们构建的出色应用程序部署到任何环境,而无需担心兼容性或其他配置。在本文中,我们将了解如何实现它。
包管理器
就我而言,我喜欢使用 pnpm 来减少 node_modules 文件夹的磁盘大小。因此,Next.js Docker 镜像的示例使用了这个包管理器,但如果您愿意,您可以稍作调整以使用 npm 或 YARN。
Next.js 配置
在 next.config.js 文件中,我们必须指定当应用程序编译用于生产时,生成的构建类型将是独立的。为此,我们需要包括以下内容:
/** @type {import('next').NextConfig} */ const nextConfig = { output: "standalone" }; export default nextConfig;
这样,应用程序的输出将是独立类型。
Dockerfile
代表我们的 Docker 镜像的文件是 Dockerfile。通常该文件放置在项目的根目录中。让我们一步一步来创建它。
基础镜像
每个 Docker 镜像都从基础镜像开始。在这种情况下,任何运行服务器的 JavaScript 项目都需要像 Node.js 这样的运行时。我们将以与我们的项目兼容的 Node.js 版本的 Docker 镜像为基础。就我而言,我喜欢使用 Alpine 版本的图像,因为它更轻量。但是,我们在构建镜像时必须检查是否存在兼容性问题,否则,我们必须使用“非Alpine”版本的镜像。对于此示例,我使用 node:22.6.0-alpine3.19 图像作为基础。
/** @type {import('next').NextConfig} */ const nextConfig = { output: "standalone" }; export default nextConfig;
我们放置一个别名以在图像的不同步骤或阶段回收它。
系统和 pnpm 依赖项
下一阶段是安装依赖项。在这种情况下,只需要一个系统依赖项:libc6-compat。这里提到了原因。
FROM node:22.6.0-alpine3.19 AS base
由于 Node.js 默认不包含 pnpm,因此需要激活它并设置环境变量,以便缓存已安装的包。
FROM base AS build-deps RUN apk add --no-cache libc6-compat
然后,我们必须设置工作目录,以明确区分系统文件夹和应用程序文件夹。在本例中,我们使用 /app。
ENV PNPM_HOME="/pnpm" ENV PATH="$PNPM_HOME:$PATH" RUN corepack enable RUN corepack prepare pnpm@latest --activate
现在我们必须复制包含项目依赖信息的文件并安装它们。
WORKDIR /app
--frozen-lockfile 和 --prefer-frozen-lockfile 参数用于遵守 pnpm 锁定文件中指定的版本。
为了完成此阶段,添加了 Sharp 库。这是在 Next.js 生产环境中优化图像所必需的。
COPY package.json pnpm-lock.yaml ./ RUN pnpm install --frozen-lockfile --prefer-frozen-lockfile
整个舞台是这样的:
RUN pnpm add sharp
构建应用程序
下一阶段是编译 Next.js 应用程序。这是使映像正常工作的关键所在,因为 Dockerfile 的其余部分没有任何不同,或者您在任何其他示例中找不到。 在此阶段,需要将项目中使用的环境变量作为构建参数传递,并在生成构建之前设置它们。
这是因为,由于应用程序有两个工作时间,即构建时间和运行时间,如果环境变量在运行时不可用,则所有使用它们的静态资源都不会具有它们的值并且该应用程序将无法正常工作。在此示例中,使用了三个环境变量:NEXT_PUBLIC_BACKEND_URL、FRONTEND_URL 和 JWT_SECRET。
FROM base AS build-deps RUN apk add --no-cache libc6-compat ENV PNPM_HOME="/pnpm" ENV PATH="$PNPM_HOME:$PATH" RUN corepack enable RUN corepack prepare pnpm@latest --activate WORKDIR /app COPY package.json pnpm-lock.yaml ./ RUN pnpm install --frozen-lockfile --prefer-frozen-lockfile RUN pnpm add sharp
然后,pnpm 被激活,工作目录被设置,所有应用程序文件被复制并生成构建。
FROM base AS builder ARG NEXT_PUBLIC_BACKEND_URL ENV NEXT_PUBLIC_BACKEND_URL=$NEXT_PUBLIC_BACKEND_URL ARG FRONTEND_URL ENV FRONTEND_URL=$FRONTEND_URL ARG JWT_SECRET ENV JWT_SECRET=$JWT_SECRET
整个舞台是这样的:
RUN corepack enable RUN corepack prepare pnpm@latest --activate WORKDIR /app COPY --from=build-deps /app/node_modules ./node_modules COPY . . RUN pnpm build
运行应用程序
最后一个阶段是运行应用程序。为此,我们首先设置 Node 生产环境:
/** @type {import('next').NextConfig} */ const nextConfig = { output: "standalone" }; export default nextConfig;
根据个人喜好,Next.js 遥测被禁用。也就是说,我们基本上不会将应用程序数据发送到 Vercel 来通过错误诊断和使用指标来改进 Next.js。
FROM node:22.6.0-alpine3.19 AS base
此外,作为一个好的实践,建议在 Docker 镜像中使用非 root 用户。例如,这可以避免容器有权访问主机网络时出现安全漏洞。为此,需要添加一个 nodejs 组和一个 nextjs 用户并分配 .next 文件夹属性。
FROM base AS build-deps RUN apk add --no-cache libc6-compat
然后,复制独立构建生成的文件以创建与 Next.js 默认构建相同的结构。
ENV PNPM_HOME="/pnpm" ENV PATH="$PNPM_HOME:$PATH" RUN corepack enable RUN corepack prepare pnpm@latest --activate
由于我们创建了 nextjs 用户,我们需要指定这将是要使用的用户。
WORKDIR /app
同样,需要指定容器暴露的端口,以及将使用的节点端口和主机名,由于我们不知道确切的地址,因此主机名将为 0.0.0.0。
COPY package.json pnpm-lock.yaml ./ RUN pnpm install --frozen-lockfile --prefer-frozen-lockfile
然后,从构建参数中指定应用程序运行时的环境变量。
RUN pnpm add sharp
可以使用 docker-compose.yml 文件中指定的环境变量,以及运行容器时,但是,在此上下文中的环境变量在构建时和运行时不同是没有意义的.
最后,我们运行服务器。
FROM base AS build-deps RUN apk add --no-cache libc6-compat ENV PNPM_HOME="/pnpm" ENV PATH="$PNPM_HOME:$PATH" RUN corepack enable RUN corepack prepare pnpm@latest --activate WORKDIR /app COPY package.json pnpm-lock.yaml ./ RUN pnpm install --frozen-lockfile --prefer-frozen-lockfile RUN pnpm add sharp
完整文件
完整的 Dockerfile 如下所示:
FROM base AS builder ARG NEXT_PUBLIC_BACKEND_URL ENV NEXT_PUBLIC_BACKEND_URL=$NEXT_PUBLIC_BACKEND_URL ARG FRONTEND_URL ENV FRONTEND_URL=$FRONTEND_URL ARG JWT_SECRET ENV JWT_SECRET=$JWT_SECRET
您还可以在此要点中找到该文件。
结论
为 Next.js 应用程序创建 Docker 镜像一开始可能会令人畏惧,因为我们必须考虑所有因素。此外,人们普遍认为自托管 Next.js 应用程序,即。例如,在 Vercel 之外,情况很复杂。事实并非如此。了解了关键部分,其实很简单。
我希望通过这些信息,您可以毫无问题地对您的 Next.js 应用程序进行 dockerize。你知道该怎么做,如果你有任何问题或想分享一些东西,请留在评论中:)
以上是使用独立构建对 Next.js 应用程序进行 Docker 化的详细内容。更多信息请关注PHP中文网其他相关文章!

JavaScript字符串替换方法详解及常见问题解答 本文将探讨两种在JavaScript中替换字符串字符的方法:在JavaScript代码内部替换和在网页HTML内部替换。 在JavaScript代码内部替换字符串 最直接的方法是使用replace()方法: str = str.replace("find","replace"); 该方法仅替换第一个匹配项。要替换所有匹配项,需使用正则表达式并添加全局标志g: str = str.replace(/fi

本教程向您展示了如何将自定义的Google搜索API集成到您的博客或网站中,提供了比标准WordPress主题搜索功能更精致的搜索体验。 令人惊讶的是简单!您将能够将搜索限制为Y

因此,在这里,您准备好了解所有称为Ajax的东西。但是,到底是什么? AJAX一词是指用于创建动态,交互式Web内容的一系列宽松的技术。 Ajax一词,最初由Jesse J创造

本文系列在2017年中期进行了最新信息和新示例。 在此JSON示例中,我们将研究如何使用JSON格式将简单值存储在文件中。 使用键值对符号,我们可以存储任何类型的

增强您的代码演示:开发人员的10个语法荧光笔 在您的网站或博客上共享代码片段是开发人员的常见实践。 选择合适的语法荧光笔可以显着提高可读性和视觉吸引力。 t

利用轻松的网页布局:8个基本插件 jQuery大大简化了网页布局。 本文重点介绍了简化该过程的八个功能强大的JQuery插件,对于手动网站创建特别有用

本文介绍了关于JavaScript和JQuery模型视图控制器(MVC)框架的10多个教程的精选选择,非常适合在新的一年中提高您的网络开发技能。 这些教程涵盖了来自Foundatio的一系列主题

核心要点 JavaScript 中的 this 通常指代“拥有”该方法的对象,但具体取决于函数的调用方式。 没有当前对象时,this 指代全局对象。在 Web 浏览器中,它由 window 表示。 调用函数时,this 保持全局对象;但调用对象构造函数或其任何方法时,this 指代对象的实例。 可以使用 call()、apply() 和 bind() 等方法更改 this 的上下文。这些方法使用给定的 this 值和参数调用函数。 JavaScript 是一门优秀的编程语言。几年前,这句话可


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

Dreamweaver CS6
视觉化网页开发工具

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境