|
此版本仍在开发中,尚未被视为稳定版本。如需最新稳定版本,请使用 Spring Boot 4.0.4! |
高效的容器镜像
可以轻松地将 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 的帮助下支持 war 文件的分层。
对于 Maven,请参阅 打包分层 jar 或 war 部分,以了解有关向归档添加层索引的更多详细信息。 对于 Gradle,请参阅 Gradle 插件文档中的 打包分层 jar 或 war 部分。