docker multi-stage 多阶段构建


我们在构建自己的 docker镜像时,总是希望自己构建的镜像尽可能的小,那么我们可以使用 dockermulti-stage(多阶段)来构建镜像。 下文,我们来演示一个例子,比较一下普通构建镜像和多阶段构建镜像的镜像大小。

注意:

  1. multi-stage需要 docker 17.05 或更高的版本上才可以使用。
  2. 参考的官方文档 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"]

注意:

  1. 多阶段构建是写在一个Dockerfile文件中的,可以看出里面有2个FROM等
  2. FROM maven:3.6.2-jdk-11-slim AS build 后方的 这个 build 表示为我们的构建阶段取一个名字
  3. COPY --from=build 中的--from=build 表示从build这个阶段中拷贝内容。

2、构建镜像

docker build -t quartz-manager-multi-stage -f Dockerfile-multi-stage .

四、比较2个镜像的体积大小

体积大小比较
多阶段镜像的构建可以帮助我们减小构建后的镜像的体积大小,但是需要注意的是 17.05 及以后的版本才可以使用。

posted @ 2019-10-27 12:30  huan1993  阅读(92)  评论(0编辑  收藏  举报