天天看點

多階段建構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鏡像

執行:docker build -t demo . 使用該Dockerfile檔案建構鏡像;

該鏡像生成後:

多階段建構Docker鏡像

文章首發位址:Solinx

http://www.solinx.co/archives/1111