此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Boot 3.5.5! |
高效的容器镜像
很容易将 Spring Boot uber jar 打包为 Docker 镜像。但是,在 Docker 镜像中按原样复制和运行 uber jar 有各种缺点。在不解包的情况下运行 uber 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
此分层旨在根据应用程序生成之间更改的可能性来分离代码。库代码不太可能在生成之间更改,因此它被放置在自己的层中,以允许工具重复使用缓存中的层。应用程序代码更有可能在生成之间更改,因此它被隔离在单独的层中。
Spring Boot 还支持在layers.idx
.
对于 Maven,请参阅打包分层 jar 或 war 部分,了解有关向存档添加层索引的更多详细信息。对于 Gradle,请参阅 Gradle 插件文档的打包分层 jar 或 war 部分。