多阶段构建
我们在构建自己的
docker
镜像时,总是希望自己构建的镜像尽可能的小,那么我们可以使用 docker
的 multi-stage
(多阶段)来构建镜像。下文,我们来演示一个例子,比较一下普通构建镜像和多阶段构建镜像的镜像大小。
注意:
-
multi-stage
需要docker 17.05
或更高的版本上才可以使用。 - 参考的官方文档 multi-stage
一、需求
我们使用git
来下载一个maven
项目,然后构建成一个镜像,比较一下普通构建和使用multi-stage构建的镜像的体积大小。
二、普通构建
1、编写Dockerfile
Dockerfile文件的名字为 Dockerfile-old
FROM maven:3.6.2-jdk-11-slim
RUN apt-get update \
&& apt-get install -y git \
&& git clone https://gitee.com/huan1993/quartz-manager.git \
&& cd quartz-manager \
&& mvn clean package
EXPOSE 9090
ENTRYPOINT ["java","-jar","/quartz-manager/target/quartz-manager-0.0.1-SNAPSHOT.jar"]
2、构建镜像
docker build -t quartz-manager-old -f Dockerfile-old .
三、多阶段(multi-stage)构建
1、编写Dockerfile
Dockerfile文件的名字为 Dockerfile-multi-stage
FROM maven:3.6.2-jdk-11-slim AS build
RUN apt-get update \
&& apt-get install -y git \
&& git clone https://gitee.com/huan1993/quartz-manager.git \
&& cd quartz-manager \
&& mvn clean package
FROM openjdk:11.0.5-jre-slim-buster
COPY --from=build /quartz-manager/target/quartz-manager-0.0.1-SNAPSHOT.jar .
EXPOSE 9090
ENTRYPOINT ["java","-jar","./quartz-manager-0.0.1-SNAPSHOT.jar"]
注意:
- 多阶段构建是写在一个
Dockerfile
文件中的,可以看出里面有2个FROM等 - FROM maven:3.6.2-jdk-11-slim
AS build
后方的 这个build
表示为我们的构建阶段取一个名字 -
COPY --from=build
中的--from=build
表示从build
这个阶段中拷贝内容。
2、构建镜像
docker build -t quartz-manager-multi-stage -f Dockerfile-multi-stage .
四、比较2个镜像的体积大小
多阶段镜像的构建可以帮助我们减小构建后的镜像的体积大小,但是需要注意的是 17.05 及以后的版本才可以使用。