在Docker 17.05及更高的版本中支持支持一种全新的构建镜像模式:多阶段构建;
多阶段构建Docker镜像的最大好处是使构建出来的镜像变得更小;docker
目前常见的两个构建镜像的方式为:
一、直接使用某基础镜像,在此基础上安装环境构建应用、部署应用;
二、构建应用和部署应用为不一样镜像,使用某基础镜像构建应用,而后经过数据卷将应用共享给新镜像;
第一种方式构建出来的镜像一般都很是大,并且还有许多构建应用时生成的飞运行应用所须要的问题,好比Maven就会生成很多依赖;
第二种方式镜像稍有减少,作到了构建应与部署应用镜像的分离但又出现了新的问题,本来只须要一个Dockerfile如今分离后又多出来一个Dockerfile文件,管理Dockerfile与数据卷也都是麻烦的事情;app
下面再Dockerfile文件中使用多阶段构建;
一、该Dockerfile中有两个FROM为两步构建,在Maven基础镜像中编译生成Jar、依赖,这阶段命名为:BUILD
二、使用linx/alpine-jdk8:0.1做为基础镜像,设置环境、建立目录,更重要的是使用COPY --from把BUILD阶段生成的项目文件拷贝到镜像中;maven
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
项目目录:ui
执行:docker build -t demo . 使用该Dockerfile文件构建镜像;netty
该镜像生成后:code
文章首发地址:Solinx
http://www.solinx.co/archives/1111xml