使用 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 和 buildpack 支援。

分層 Jar

分層 Jar 功能在開始支援自定義層時發展了很多。雖然需要表達 Jar 應該在映象建立時分成的層是顯而易見的,但改變 Jar 的格式來這樣做似乎不再是必要的。Spring Boot 2.3 包含使用 layers.idx 檔案對 Jar 進行分層的支援。層索引檔案提供了一個層列表以及 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 Jar 模式使用這些層來製作 Dockerfile。有關如何在 Dockerfile 中使用 Jar 模式的詳細資訊,請參閱之前的博文

雲原生 Buildpacks 支援

透過 Spring Boot Maven 和 Gradle 外掛對雲原生 Buildpacks 的支援自上一篇博文以來沒有改變,相關詳細資訊可以在這裡找到。

自定義層

雖然我們認為開箱即用的層適用於大多數 Spring Boot 應用程式,但可能需要根據應用程式的需求進行調整。例如,您可能有一些組織範圍的依賴項,它們以與常規依賴項不同的節奏進行更改。這可能需要將這些依賴項拆分為一個單獨的層。layers.idx 檔案可以使用 Maven 和 Gradle 外掛進行自定義。以下示例顯示瞭如何使用帶有 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 層,其中包含所有 groupId 為 com.acme 的庫。

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

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

獲取 Spring 新聞通訊

透過 Spring 新聞通訊保持聯絡

訂閱

領先一步

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

瞭解更多

獲得支援

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案,只需一份簡單的訂閱。

瞭解更多

即將舉行的活動

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

檢視所有