高效容器映像

將 Spring Boot 超級 Jar 封裝為 Docker 映像檔是很容易的。然而,在 Docker 映像檔中複製並直接執行超級 Jar 有各種缺點。在不解壓縮的情況下執行超級 Jar 總有一定的額外開銷,而在容器化環境中,這可能會很明顯。另一個問題是將應用程式的程式碼及其所有依賴項放在 Docker 映像檔的一個層中並非最佳做法。由於您重新編譯程式碼的頻率可能高於升級 Spring Boot 版本的頻率,因此最好將事物稍微分開。如果您將 jar 檔案放在應用程式類別之前的層中,Docker 通常只需要變更最底層,並且可以從其快取中提取其他層。

分層 Docker 映像檔

為了更容易建立最佳化的 Docker 映像檔,Spring Boot 支援將層索引檔案新增至 jar 檔。它提供層清單以及應包含在其中的 jar 檔部分。索引中的層清單依據應將層新增至 Docker/OCI 映像檔的順序排序。開箱即用,支援以下層

  • dependencies (用於常規發布的依賴項)

  • spring-boot-loader (用於 org/springframework/boot/loader 下的所有內容)

  • snapshot-dependencies (用於快照依賴項)

  • application (用於應用程式類別和資源)

以下顯示 layers.idx 檔案的範例

- "dependencies":
  - BOOT-INF/lib/library1.jar
  - BOOT-INF/lib/library2.jar
- "spring-boot-loader":
  - org/springframework/boot/loader/launch/JarLauncher.class
  - ... <other classes>
- "snapshot-dependencies":
  - BOOT-INF/lib/library3-SNAPSHOT.jar
- "application":
  - META-INF/MANIFEST.MF
  - BOOT-INF/classes/a/b/C.class

此分層旨在根據程式碼在應用程式建置之間變更的可能性來分隔程式碼。程式庫程式碼在建置之間不太可能變更,因此它被放置在自己的層中,以允許工具重複使用快取中的層。應用程式程式碼在建置之間更可能變更,因此它被隔離在單獨的層中。

layers.idx 的協助下,Spring Boot 也支援 war 檔案的分層。

對於 Maven,請參閱封裝分層 jar 或 war 區段,以取得有關將層索引新增至歸檔的更多詳細資訊。對於 Gradle,請參閱 Gradle 外掛程式文件的封裝分層 jar 或 war 區段