領先一步
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
jarmode 製作使用這些層的 Dockerfile。關於如何將 jarmode 與 Dockerfile 搭配使用的詳細資訊,請參閱先前的部落格文章。
自上一篇部落格文章以來,透過 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 映像的更多詳細資訊,您可以查看Maven和Gradle外掛程式的參考文件。