高效的容器镜像
很容易将 Spring Boot uber jar 打包为 Docker 镜像。 但是,在 Docker 镜像中按原样复制和运行 uber jar 有各种缺点。 在不拆包的情况下运行 uber jar 时,总是会产生一定的开销,在容器化环境中,这可能会很明显。 另一个问题是,将应用程序的代码及其所有依赖项放在 Docker 映像中的一层中并不是最佳的。 由于重新编译代码的频率可能高于升级使用的 Spring Boot 版本,因此通常最好将内容分开一点。 如果你把 jar 文件放在应用程序类之前的层中,Docker 通常只需要更改最底层,就可以从它的缓存中获取其他文件。
分层 Docker 镜像
为了更轻松地创建优化的 Docker 镜像,Spring Boot 支持向 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 部分。