日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

Java項目容器化構建最佳實踐

使用Dockerfile將源代碼構建成容器鏡像,進行鏡像分發、部署。相比于Golang或Python項目,Java項目因企業一般會選擇自建依賴倉庫(如Maven)導致容器化構建難度高,因不熟悉Dockerfile緩存機制導致構建速度較慢。本文從典型用戶場景(云上自建GitLab代碼倉庫、自建Maven倉庫)出發,介紹如何利用Dockerfile構建Java項目,如何提速構建過程以及如何利用ACR-EE構建服務來進行自動化鏡像構建。

前提條件

  • 已創建GitLab代碼倉庫。

  • 已創建Maven倉庫。本文選擇云效Maven倉庫,更多內容,請參見云效Maven倉庫

  • 已創建ACR-EE企業版,更多內容,請參見創建企業版實例

項目介紹

本文使用具有依賴的兩個Java項目進行演示。分別有以下兩個項目:

  • Provider:提供服務,供調用。

    • Core模塊:提供公共接口。

    • Service模塊:服務實現模塊。

  • Consumer:調用Provider服務。

    • Service模塊:需要依賴Provide項目里的Core模塊。參考代碼如下:

      .
      ├── consumer
      │ ├── Dockerfile
      │ ├── consumer.iml
      │ ├── pom.xml
      │ └── service
      │     ├── pom.xml
      │     ├── src
      │     └── target
      └── provider
          ├── Dockerfile
          ├── core
          │ ├── pom.xml
          │ ├── src
          │ └── target
          ├── pom.xml
          ├── provider.iml
          └── service
              ├── pom.xml
              ├── src
              └── target

構建產物:

  • 基于Provider工程構建出生產者應用鏡像。

  • 基于Consumer工程構建出消費者應用鏡像。

步驟一:確定公共依賴包已上傳

項目引用的公共依賴包需要提前上傳到自建Maven倉庫。以這里的Provider為例,您可以在Provider目錄下執行以下上傳命令:

mvn clean install org.apache.maven.plugins:maven-deploy-plugin:2.8:deploy -DskipTests

步驟二:制作專屬Maven基礎鏡像

為了在容器化構建環境內能訪問到自建Maven倉庫,需要把Maven倉庫配置放到基礎鏡像內。這里建議基于官方Maven鏡像來打造您的企業專屬公共Maven基礎鏡像,應用項目直接引用該基礎鏡像即可訪問Maven倉庫。

  1. 將以下文件保存成Dockerfile并和Maven倉庫的《settings.xml》文件放到同一目錄。

    FROM maven:3.8-openjdk-8 #指定與項目匹配的Maven鏡像,該示例環境為3.8版本的Maven。
    
    ADD settings.xml /root/.m2/ #將自建Maven倉庫配置放到對應位置。
  2. 執行以下命令構建并推送到遠程鏡像倉庫。

    ls
    Dockerfile   settings.xml
    
    docker build -t demo-registry-vpc.cn-beijing.cr.aliyuncs.com/demo/maven-base:3.8-openjdk-8 -f Dockerfile .
    Sending build context to Docker daemon   7.68kB
    Step 1/2 : FROM maven:3.8-openjdk-8
     ---> a3f42bfde036
    Step 2/2 : ADD settings.xml /root/.m2/
     ---> db0d5a5192e3
    Successfully built db0d5a5192e3
    Successfully tagged demo-registry-vpc.cn-beijing.cr.aliyuncs.com/demo/maven-base:3.8-openjdk-8
    
    docker push demo-registry-vpc.cn-beijing.cr.aliyuncs.com/demo/maven-base:3.8-openjdk-8

步驟三:構建Consumer應用鏡像(Provider項目略過)

執行以下命令。(建議將構建過程中需要的基礎鏡像全部推送到阿里云鏡像倉庫。)

FROM demo-registry-vpc.cn-beijing.cr.aliyuncs.com/demo/maven-base:3.8-openjdk-8 AS builder

# add pom.xml and source code
ADD ./pom.xml pom.xml
ADD ./service service/

# package jar
RUN mvn clean package

# Second stage: minimal runtime environment
From demo-registry-vpc.cn-beijing.cr.aliyuncs.com/demo/openjdk:8-jre-alpine

# copy jar from the first stage
COPY --from=builder service/target/service-1.0-SNAPSHOT.jar service-1.0-SNAPSHOT.jar

EXPOSE 8080

CMD ["java", "-jar", "service-1.0-SNAPSHOT.jar"]

步驟四:優化構建速度

步驟三:構建Consumer應用鏡像(Provider項目略過)中,您已經能構建出鏡像,但是當您修改代碼、重復構建時會發現每次都會重復拉取JAR包,而無法利用到JAR包緩存,構建速度比較緩慢。這是因為Dockerfile有自己的緩存生效機制,當修改源代碼后,ADD指令內的文件內容hash后出現了值變化導致RUN指令需要重新構建,沒辦法利用到先前的構建結果緩存。更多內容,請參見關于緩存和Dockerfile最佳實踐

我們優化構建速度的思路是將Maven依賴能緩存并重復利用:

  1. 首先將項目的《pom.xml》文件拷貝進容器,下載依賴。只要項目不改動《pom.xml》文件,后續構建都能利用到緩存。

  2. 拷貝項目的源碼并編譯。

一個改進的Dockerfile如下所示,項目首次構建耗時43s,后續如果僅僅是改動源代碼構建時間可以縮短到7s。

FROM demo-registry-vpc.cn-beijing.cr.aliyuncs.com/demo/maven-base:3.8-openjdk-8 AS builder

# To resolve dependencies in a safe way (no re-download when the source code changes)
ADD ./pom.xml pom.xml
ADD ./service/pom.xml service/pom.xml
RUN  mvn install

ADD ./service service/

# package jar
RUN mvn clean package

# Second stage: minimal runtime environment
From demo-registry-vpc.cn-beijing.cr.aliyuncs.com/demo/openjdk:8-jre-alpine

# copy jar from the first stage
COPY --from=builder service/target/service-1.0-SNAPSHOT.jar service-1.0-SNAPSHOT.jar

EXPOSE 8080

CMD ["java", "-jar", "service-1.0-SNAPSHOT.jar"]

步驟五:基于ACR-EE的自動化構建流程

ACR-EE提供了企業級構建服務能力,推薦企業客戶使用,更多內容,請參見使用企業版實例構建鏡像

以下將為您介紹幾個在使用過程中會用到的最佳實踐。

  • 使用VPC內網構建模式

    針對云上自建GitLab,建議使用VPC內網安全構建模式來構建鏡像, 避免向公網暴露服務。更多內容,請參見使用VPC安全構建模式構建容器鏡像

  • 使用鏡像版本不可變功能

    推薦倉庫打開版本不可變功能,以防止線上版本被覆蓋。創建鏡像倉庫

  • 創建基于Commit ID的構建規則

    每次構建生成兩個鏡像版本,一個版本使用代碼Commit ID來表示,方便鏡像版本和代碼版本對應起來;另一個版本使用latest表示最新版本。修改構建規則

    提交代碼并觸發構建。下圖是提交兩次代碼后自動觸發的兩次構建過程,每次都生成了兩個鏡像,并且因為緩存命中加速原因,第二次構建更快。1