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” ]
