高效的容器映像

很容易将 Spring Boot uber jar 打包为 Docker 镜像。 但是,在 Docker 镜像中按原样复制和运行 uber jar 存在各种缺点。 在不解包的情况下运行 uber jar 时,总会有一定的开销,在容器化环境中,这可能会很明显。 另一个问题是,将应用程序的代码及其所有依赖项放在 Docker 映像的一层中并不是最佳选择。 由于您可能更频繁地重新编译代码,而不是升级您使用的 Spring Boot 版本,因此通常最好将内容分开更多。 如果你把 jar 文件放在应用程序类之前的层中,Docker 通常只需要改变最底层,就可以从它的缓存中获取其他文件。spring-doc.cadn.net.cn

对 Docker 镜像进行分层

为了更轻松地创建优化的 Docker 映像, Spring Boot 支持向 jar 中添加层索引文件。 它提供了一个层列表以及应包含在其中的 jar 部分。 索引中的层列表根据层应添加到 Docker/OCI 映像的顺序进行排序。 开箱即用,支持以下层:spring-doc.cadn.net.cn

下面显示了一个layers.idx文件:spring-doc.cadn.net.cn

- "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-doc.cadn.net.cn

Spring Boot 还支持在layers.idx.spring-doc.cadn.net.cn

对于 Maven,请参阅打包分层 jar 或 war 部分,以了解有关向存档添加层索引的更多详细信息。 对于 Gradle,请参阅 Gradle 插件文档的打包分层 jar 或 war 部分spring-doc.cadn.net.cn