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

在 Node.js 项目中创建 Dockerfile 的核心实践

Dockerfile 是一份文本说明,用于指引 Docker 如何组装镜像。当执行 docker build 构建镜像时,Docker 会按指令逐条执行并生成镜像。

下面是为应用创建 Dockerfile 的简要流程。请在项目根目录新建一个名为 Dockerfile 的文件并在编辑器中打开。

第一行通常是用于指定语法解析器的指令。虽然可选,但它告诉构建器使用哪种 Dockerfile 语法,并允许在较旧的版本中在构建前升级解析器。该指令应放在文件的最前面,不应有前置空格或其他注释。

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

接下来,我们需要在 Dockerfile 中添加一行,指定应用的基础镜像。

FROM node:12.18.1

镜像可以从其他镜像继承。因此我们选择官方的 Node.js 镜像,避免从头构建基础环境。这样可以直接在镜像中获得运行 Node.js 应用所需的一切工具和依赖项。

这相当于让一个子类 Myimage 继承自基类 NodeBaseimage 的功能。

同时,在使用 FROM 指令时,Docker 会把该镜像中的全部功能引入到新镜像中,即包含 node:12.18.1 的内容。

通过设置 NODE_ENV 环境变量,可以指定应用运行的环境。为了提升性能,最简单的做法之一是在生产环境中将其设为 Production。

ENV NODE_ENV=Production

为了在后续命令执行时更方便,我们创建一个工作目录。这样后续命令都以该路径作为默认位置,便于使用相对路径。

WORKDIR /app

通常在获取 Node.js 项目后,第一步是安装依赖,以确保应用能在映像中找到所需的 node_modules。

在执行 npm install 之前,需要将 package.json 与 package-lock.json 放入镜像。我们使用 COPY 指令完成此操作。Copy 有两个参数:源文件和目标路径。此处将 package.json 与 package-lock.json* 复制到工作目录 /app。

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

请注意,我们只复制 package.json 及其锁文件,以便利用 Docker 缓存层。随后可通过 RUN 指令执行 npm install,将依赖安装到镜像内的 node_modules 目录。

RUN npm install –production

此时,我们已经基于 Node 版本 12.18.1 的镜像,且安装了所有依赖。接下来将源代码添加到镜像中,方法同样使用 COPY。

COPY . .

COPY 指令会将当前目录下的所有文件复制到镜像中。随后我们需要指定容器启动时执行的命令,这通常使用 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” ]