多阶段构建Docker镜像

在Docker 17.05及更高的版本中支持支持一种全新的构建镜像模式:多阶段构建
  多阶段构建Docker镜像的最大好处是使构建出来的镜像变得更小;

  目前常见的两个构建镜像的方式为:
  1、直接使用某基础镜像,在此基础上安装环境构建应用、部署应用;
  2、构建应用和部署应用为不同镜像,使用某基础镜像构建应用,然后通过数据卷将应用共享给新镜像;
  第一种方式构建出来的镜像通常都非常大,而且还有许多构建应用时生成的飞运行应用所需要的问题,比如Maven就会生成不少依赖;
  第二种方式镜像稍有减小,做到了构建应与部署应用镜像的分离但又出现了新的问题,原本只需要一个Dockerfile现在分离后又多出来一个Dockerfile文件,管理Dockerfile与数据卷也都是麻烦的事情;

多阶段构建

  下面再Dockerfile文件中使用多阶段构建;
  1、该Dockerfile中有两个FROM为两步构建,在Maven基础镜像中编译生成Jar、依赖,这阶段命名为:BUILD
  2、使用linx/alpine-jdk8:0.1作为基础镜像,设置环境、创建目录,更重要的是使用COPY --from把BUILD阶段生成的项目文件拷贝到镜像中;

 FROM maven:3.5-jdk-8 as BUILD

 COPY src /usr/app/src
 COPY pom.xml /usr/app
 COPY ./docker/start.sh /usr/app/

 RUN mvn -f /usr/app/pom.xml clean package  -U -Dmaven.test.skip=true
 RUN mvn -f /usr/app/pom.xml dependency:copy-dependencies

 FROM linx/alpine-jdk8:0.1

 # 设置locale
 ENV LANG en_US.UTF-8
 ENV LANGUAGE en_US:en
 ENV LC_ALL en_US.UTF-8
 ENV TZ=Asia/Shanghai

 RUN mkdir /app_home

 WORKDIR /app_home

 COPY --from=BUILD /usr/app/target/nettyDemo-1.0-SNAPSHOT.jar /app_home
 COPY --from=BUILD /usr/app/target/dependency /app_home/dependency
 COPY --from=BUILD /usr/app/start.sh /app_home
 COPY ./docker/start.sh /app_home/
 RUN chmod +x /app_home/start.sh

 CMD  /app_home/start.sh

项目目录:

执行:docker build -t demo . 使用该Dockerfile文件构建镜像;

该镜像生成后:

文章首发地址:Solinx
http://www.solinx.co/archives/1111

原文地址:https://www.cnblogs.com/softlin/p/8138232.html