Skip to main content

多阶段编译

Docker的多阶段构建(Multi-stage build)是一种技术,它允许你在单个Dockerfile中使用多个构建阶段来构建最终的Docker镜像。这种方法的主要优势是减小镜像的大小,并且只包含构建所需的组件,而不包含构建过程中生成的临时文件和工具。这有助于优化镜像的性能和安全性。

多阶段构建的基本思想是在一个Dockerfile中定义多个"FROM"指令,每个指令表示一个构建阶段。每个阶段可以基于不同的基础镜像,并在其中运行一系列命令来构建应用程序。最终,只有最后一个阶段的输出将成为最终的Docker镜像,前面的阶段产生的中间产物都不会出现在最终镜像中。

下面是一个简单的例子来说明多阶段构建:

假设你有一个基于Node.js的简单应用程序,目录结构如下:

my-app/
├── Dockerfile
├── package.json
├── package-lock.json
└── src/
└── index.js

Dockerfile内容如下:

# 阶段一:构建阶段
FROM node:14 as builder

WORKDIR /app

COPY package.json package-lock.json ./
RUN npm install

COPY ./src ./src

# 执行构建命令,生成编译后的应用程序
RUN npm run build

# 阶段二:生成最终镜像
FROM node:14

WORKDIR /app

# 从构建阶段复制编译后的应用程序
COPY --from=builder /app/dist ./dist
COPY package.json package-lock.json ./

RUN npm install --production

CMD ["node", "./dist/index.js"]

解释一下上面的Dockerfile:

  1. 第一个阶段(构建阶段)使用node:14作为基础镜像,并命名为builder,它会安装项目的依赖项并编译源代码。

  2. 第二个阶段使用同样的node:14作为基础镜像,但它不会包含构建过程中产生的中间文件,只会复制第一个阶段中编译后的应用程序和生产依赖项。

在构建这个镜像时,Docker引擎会执行所有阶段的命令,但最终镜像只包含第二个阶段的结果。这样就可以确保最终的镜像尽可能小且只包含运行应用程序所需的内容。

使用多阶段构建可以显著减小镜像的大小,并且在生产环境中运行镜像时不会包含任何构建过程的敏感信息,从而提高了安全性。