Docker 支持多阶段构建,这允许您在单个 Dockerfile 中定义多个构建阶段。每个构建阶段都会生成一个镜像,并将其作为下一个阶段的基础镜像。
多阶段构建可以帮助您减小镜像的体积,同时保护您的应用程序的源代码。例如,您可以在第一个阶段中使用一个编译器构建您的应用程序,然后在第二个阶段中从第一个阶段中生成的镜像中删除编译器,从而减小镜像的体积。
要实现多阶段构建,您可以在 Dockerfile 中使用 FROM
命令多次,并为每个构建阶段定义不同的基础镜像。例如,下面的 Dockerfile 定义了两个构建阶段:
# Stage 1: Build the application
FROM node:latest as build
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
RUN npm run build
# Stage 2: Create a lightweight image with the built application
FROM nginx:alpine
COPY --from=build /app/dist /usr/share/nginx/html
在第一个构建阶段中,Docker 会基于 node:latest
镜像构建一个新镜像,并将其命名为 build
。然后,Docker 会在该镜像中执行一些命令,构建您的应用程序。最后,Docker 会将构建后的应用程序放入镜像中
在第二个构建阶段中,Docker 会基于 nginx:alpine
镜像构建一个新镜像。然后,Docker 会使用 COPY --from=build
命令从第一个阶段中生成的 build
镜像中拷贝构建后的应用程序。最后,Docker 会将拷贝的应用程序放入新镜像中。
多阶段构建可以帮助您在构建应用程序时减小镜像的体积,并保护您的源代码。下面是更多关于多阶段构建的信息:
- 您可以在 Dockerfile 中定义任意数量的构建阶段。每个构建阶段都会生成一个镜像,并将其作为下一个阶段的基础镜像。
- 您可以使用
--from
参数与COPY
命令一起拷贝构建阶段中的文件和目录。例如,COPY --from=build /app/dist /usr/share/nginx/html
命令会从build
镜像中拷贝/app/dist