在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