使用 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 jarmode 製作使用這些層的 Dockerfile。關於如何將 jarmode 與 Dockerfile 搭配使用的詳細資訊,請參閱先前的部落格文章

雲原生 Buildpack 支援

自上一篇部落格文章以來,透過 Spring Boot Maven 和 Gradle 外掛程式對雲原生 Buildpack 的支援沒有變更,相關詳細資訊可在此處找到:這裡

自訂層

雖然我們認為我們提供的現成層適用於大多數 Spring Boot 應用程式,但可能需要根據您的應用程式需求進行調整。例如,您可能有一些組織範圍的相依性,它們的變更頻率與一般相依性不同。這可能需要將這些相依性分割到一個單獨的層中。layers.idx 檔案可以使用 Maven 和 Gradle 外掛程式進行自訂。以下範例示範如何使用單獨的 layers.xml 檔案和 Maven 外掛程式來執行此操作

<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>

上述組態使用所有具有 com.acme groupId 的程式庫建立額外的 company-dependencies 層。

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

如需關於如何使用分層和 buildpack 整合來建立最佳化 Docker 映像的更多詳細資訊,您可以查看MavenGradle外掛程式的參考文件。

取得 Spring 電子報

隨時關注 Spring 電子報

訂閱

領先一步

VMware 提供訓練和認證,以加速您的進展。

瞭解更多

取得支援

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

瞭解更多

即將舉行的活動

查看 Spring 社群中所有即將舉行的活動。

檢視全部