使用 Spring Boot 2.3 建立高效的 Docker 映象

工程 | Madhura Bhave | 2020 年 8 月 14 日 | ...

這是對關於使用 Spring Boot 2.3 建立 Docker 映象的原始部落格文章的更新。與 Spring Boot 2.3 的第一個里程碑版本和 GA 版本之間相比,與映象建立相關的一些事情發生了變化。

Spring Boot 2.3 中引入的兩個新特性有助於改進映象建立技術:分層 Jar 和構建包支援。

分層 Jar

當我們開始新增對自定義層的支援時,分層 Jar 功能得到了很大的發展。雖然很明顯需要表達 Jar 應該被分成哪些層來建立映象,但改變 Jar 的格式似乎不再必要。 Spring Boot 2.3 包含使用 layers.idx 檔案分層 Jar 的支援。 layers index 檔案提供了一個層列表以及 Jar 中應包含在其中的部分。 層按應新增到 Docker/OCI 映象的順序寫入。

預設情況下,定義了以下層

  • dependencies 用於任何版本不包含 SNAPSHOT 的依賴項。
  • spring-boot-loader 用於 Jar 載入器類。
  • snapshot-dependencies 用於任何版本包含 SNAPSHOT 的依賴項。
  • application 用於應用程式類和資源。

相應的 layers.idx 檔案如下所示

  - "dependencies":
    - "BOOT-INF/lib/dependency1.jar"
    - "BOOT-INF/lib/dependency2.jar"
  - "spring-boot-loader":
    - "org/"
  - "snapshot-dependencies":
    - "BOOT-INF/lib/dependency3-SNAPSHOT.jar"
    - "BOOT-INF/lib/dependency4-SNAPSHOT.jar"    
  - "application":
    - "BOOT-INF/classes/"
    - "META-INF/"

圖層的順序很重要,因為它決定了當應用程式的某一部分發生變化時,以前的圖層被快取的可能性。預設順序是 dependenciesspring-boot-loadersnapshot-dependenciesapplication。最不容易更改的內容應該首先新增,然後新增更可能更改的層。

要在 Spring Boot 2.3 中使用此功能,必須顯式啟用分層功能。以下示例展示瞭如何使用 Maven 外掛啟用分層

  <project>
    <build>
      <plugins>
        <plugin>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-maven-plugin</artifactId>
          <version>{gradle-project-version}</version>
          <configuration>
            <layers>
              <enabled>true</enabled>
            </layers>
          </configuration>
        </plugin>
      </plugins>
    </build>
  </project>

注意:在最新的 Spring Boot 2.4 快照中,預設啟用分層。

一旦建立了包含 layers.idx 檔案的 Jar,就可以使用 layertools jarmode 來使用這些層製作 Dockerfile。有關如何在 Dockerfile 中使用 jarmode 的詳細資訊,請參見之前的部落格文章

雲原生構建包支援

自上一篇部落格文章以來,透過 Spring Boot Maven 和 Gradle 外掛對雲原生構建包的支援沒有改變,有關詳細資訊,請參見此處

自定義層

雖然我們認為我們提供的開箱即用的層適用於大多數 Spring Boot 應用程式,但可能需要根據應用程式的需求進行調整。例如,您可能有一些組織範圍的依賴項,這些依賴項的更改速度與常規依賴項不同。這可能需要將這些依賴項拆分為一個單獨的層。可以使用 Maven 和 Gradle 外掛自定義 layers.idx 檔案。以下示例展示瞭如何使用 Maven 外掛和單獨的 layers.xml 檔案來執行此操作

<layers xmlns="http://www.springframework.org/schema/boot/layers"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://www.springframework.org/schema/boot/layers
              https://www.springframework.org/schema/boot/layers/layers-{spring-boot-xsd-version}.xsd">
    <application>
      <into layer="spring-boot-loader">
        <include>org/springframework/boot/loader/**</include>
      </into>
      <into layer="application" />
    </application>
    <dependencies>
      <into layer="snapshot-dependencies">
        <include>*:*:*SNAPSHOT</include>
      </into>
      <into layer="company-dependencies">
        <include>com.acme:*</include>
      </into>
      <into layer="dependencies"/>
    </dependencies>
    <layerOrder>
      <layer>dependencies</layer>
      <layer>spring-boot-loader</layer>
      <layer>snapshot-dependencies</layer>
      <layer>company-dependencies</layer>
      <layer>application</layer>
    </layerOrder>
</layers>

上面的配置建立了一個額外的 company-dependencies 層,其中包含所有具有 com.acme groupId 的庫。

Paketo Spring Boot 構建包也已更新以支援 layers.idx 檔案,因此對其應用的任何自定義都將反映在構建包建立的映象中。

有關如何使用分層和構建包整合來建立最佳化的 Docker 映象的更多詳細資訊,您可以檢視 MavenGradle 外掛的參考文件。

獲取 Spring 新聞通訊

訂閱 Spring 新聞通訊,保持聯絡

訂閱

搶佔先機

VMware 提供培訓和認證,以加速您的進步。

瞭解更多

獲得支援

Tanzu Spring 在一個簡單的訂閱中提供對 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案。

瞭解更多

即將舉行的活動

檢視 Spring 社群中所有即將舉行的活動。

檢視全部