高效容器镜像

将 Spring Boot 胖 JAR 打包成 Docker 镜像非常容易。然而,直接将胖 JAR 复制并在 Docker 镜像中运行存在各种缺点。在不解压的情况下运行胖 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 部分

© . This site is unofficial and not affiliated with VMware.