背景:
Docker每次build都會重新生成一個鏡像,導致每次執行maven構建會重複下載jar包,一般一個spring boot 單體應用光是Jar包都有50M起步,假設網絡延遲比較大一個鏡像打包起碼要5分鐘起步,於是經過實驗總結出2套方案,可以很好的避免每次構建鏡像重複下載Jar包問題
方案一
1.先新建一份DockerFile_Base 基礎鏡像
# 拉取編譯環境 FROM maven:3.8.1 as builder # 將源碼拷貝到固定目錄 COPY . /repository # 切換到源碼目錄 WORKDIR /repository COPY settings.xml /root/.m2/settings.xml # 使用maven進行編譯 RUN mvn clean package -DskipTests RUN rm -rf /repository
2.在服務器上執行build,讓jar包提前下載到maven倉庫
docker build -t='maven-base:latest.
3.依賴的Maven服務模塊DockerFile腳本依賴Base鏡像
# 拉取編譯環境 FROM maven-base:latest as builder # 將源碼拷貝到固定目錄 COPY . /repository # 切換到源碼目錄 WORKDIR /repository COPY settings.xml /root/.m2/settings.xml # 使用maven進行編譯 ARG EVN_NAME=dev RUN mvn clean package -pl consumer -am -amd -DskipTests -P ${EVN_NAME} # 拉取運行環境鏡像 FROM openjdk:11.0.16 VOLUME /tmp COPY --from=builder /repository/consumer/target/app /app WORKDIR /app/bin RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone EXPOSE 8090 RUN rm -rf /repository ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","-Xms4g", "-Xmx4g", "-XX:+UseG1GC","xxx.jar"]
方案二
不依賴於方案一的Docker Base,通過-Dmaven.repo.local 指定Jar包路徑
#緩存maven倉庫 RUN mvn install -Dmaven.test.skip=true -Dmaven.repo.local=./.m2 # debug RUN ls -l # 構建打包 RUN mvn -Dmaven.repo.local=./.m2 install -Dmaven.test.skip=true -P prod