在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