互联网技术 / 互联网资讯 · 2024年3月15日 0

为Node.js创建Dockerfile的云计算核心技术教程

Dockerfile 是一个文本文档,其中包含组装 Docker 映像的说明。当我们通过执行 docker build 命令告诉 Docker 构建我们的镜像时,Docker 会读取这些指令,执行它们,并因此创建一个 Docker 镜像。

让我们来看看为我们的应用程序创建 Dockerfile 的过程。在项目的根目录中,创建一个名为的文件 Dockerfile 并在文本编辑器中打开该文件。

添加到 Dockerfile 的第一行是 syntax 解析器指令。虽然是可选的,但该指令指示 Docker 构建器在解析 Dockerfile 时使用什么语法,并允许启用 BuildKit 的旧 Docker 版本在开始构建之前升级解析器。解析器指令必须出现在 Dockerfile 中任何其他注释、空格或 Dockerfile 指令之前,并且应该是 Dockerfiles 中的第一行。

我们建议使用 docker/dockerfile:1,它始终指向版本 1 语法的最新版本。BuildKit 在构建之前会自动检查语法的更新,确保您使用的是最新版本。

接下来,我们需要在我们的 Dockerfile 中添加一行,告诉 Docker 我们希望为我们的应用程序使用什么基础镜像。

FROM node:12.18.1

Docker 镜像可以从其他镜像继承。因此,我们将使用官方的 Node.js 镜像,而不是创建我们自己的基础镜像,该镜像已经拥有运行 Node.js 应用程序所需的所有工具和包。您可以像考虑面向对象编程中的类继承一样考虑这一点。

这将创建一个称为 Myimage 从基类继承功能的类 NodeBaseimage。

同样,当我们使用该 FROM 命令时,我们会告诉 Docker 在我们的镜像中包含镜像中的所有功能 node:12.18.1。

在 NODE_ENV 环境变量指定在其中的应用程序运行的环境。为提高性能可以做的最简单的事情之一是设置 NODE_ENV 为 Production.

ENV NODE_ENV=Production

为了在运行其余命令时更容易,让我们创建一个工作目录。这会指示 Docker 使用此路径作为所有后续命令的默认位置。这样我们就不必输入完整的文件路径,而是可以使用基于工作目录的相对路径。

WORKDIR /app

通常,一旦您下载了用 Node.js 编写的项目,您要做的第一件事就是安装 NPM 包。这可确保您的应用程序将其所有依赖项安装到 node_modules Node 运行时能够找到它们的目录中。

在我们可以运行之前 NPM install,我们需要将我们的 package.json 和 package-lock.json 文件放入我们的图像中。我们使用 COPY 命令来做到这一点。该 COPY 命令有两个参数。第一个参数告诉 Docker 您想要复制到镜像中的文件。第二个参数告诉 Docker 您希望将该文件复制到何处。我们将把 package.json 和 package-lock.json 文件复制到我们的工作目录中 /app。

COPY [“package.json”, “package-lock.json*”, “./”]

请注意,我们只是复制 package.json 文件,而不是复制整个工作目录。这使我们能够利用缓存的 Docker 层。一旦我们将文件放入映像中,我们就可以使用该 RUN 命令来执行命令 NPM install。这与我们在本地机器上运行 NPM install 完全相同,但这次这些 Node 模块将安装到 node_modules 我们映像内的目录中。

RUN NPM install –Production

此时,我们有一个基于节点版本 12.18.1 的镜像,并且我们已经安装了我们的依赖项。我们需要做的下一件事是将我们的源代码添加到图像中。我们将像使用 package.json 上面的文件一样使用 COPY 命令。

COPY . .

COPY 命令获取位于当前目录中的所有文件并将它们复制到映像中。现在,我们要做的就是告诉 Docker 当我们的镜像在容器内运行时我们想要运行什么命令。我们用 CMD 命令来做到这一点。

CMD [ “node”, “server.js” ]

这是完整的 Dockerfile。

FROM node:12.18.1

ENV NODE_ENV=Production

WORKDIR /app

COPY [“package.json”, “package-lock.json*”, “./”]

RUN NPM install –Production

COPY . .

CMD [ “node”, “server.js” ]