領先一步
VMware 提供培訓和認證,助您加速進步。
瞭解更多這是關於使用 Spring Boot 2.3 建立 Docker 映象的原始博文的更新。在 Spring Boot 2.3 的第一個里程碑版本和 GA 版本之間,與映象建立相關的一些內容發生了變化。
Spring Boot 2.3 中引入的兩個有助於改進映象建立技術的新功能是:分層 jar 和 buildpack 支援。
分層 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/"
層的順序很重要,因為它決定了當應用程式的一部分發生變化時,以前的層被快取的可能性。預設順序是 dependencies、spring-boot-loader、snapshot-dependencies、application。最不可能更改的內容應該首先新增,然後是更可能更改的層。
要將此功能與 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 模式的詳細資訊,請參閱之前的博文。
透過 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 映象的更多詳細資訊,您可以檢視 Maven 和 Gradle 外掛的參考文件。