🍊
翻译橙
🍊返回主站🤖参与贡献
  • hello,这里是翻译橙
  • spring boot参考文档
    • 1. 法律
    • 2. 寻求帮助
    • 3. 文档概述
    • 4. 入门
    • 5. 升级Spring Boot
    • 6. 使用 Spring Boot 进行开发
      • 6.1. 构建系统
      • 6.2. 构建你的代码
      • 6.3. 配置类
      • 6.4. 自动配置
      • 6.5. Spring Bean 和依赖注入
      • 6.6. 使用@SpringBootApplication注解
      • 6.7. 运行您的应用程序
      • 6.8. 开发者工具
      • 6.9. 打包您的生产应用程序
      • 6.10. 接下来读什么
    • 7.核心特性
      • 7.1. SpringApplication
      • 7.2. 外部化配置
      • 7.3.Profile配置
      • 7.4.日志记录
      • 7.5.国际化
      • 7.6 面向切面的编程
      • 7.7. JSON
      • 7.8. 任务执行与调度
      • 7.9. 单元测试
        • 7.9.1. 测试范围依赖
        • 7.9.2. 测试 Spring 应用程序
        • 7.9.3. 测试 Spring Boot 应用程序
        • 7.9.4. 测试容器
        • 7.9.5. 测试工具
      • 7.10. Docker Compose 支持
      • 7.11. 测试容器支持
      • 7.12. 创建您自己的自动配置
      • 7.13. Kotlin 支持
      • 7.14 SSL
      • 7.15.接下来要读什么
    • 8. 网络
      • 8.1. Servlet Web 应用程序
        • 8.1.1. “Spring Web MVC 框架”
        • 8.1.2. JAX-RS 和Jersey
        • 8.1.3. 嵌入式 Servlet 容器支持
      • 8.2 反应式网络应用程序
        • 8.2.1. “Spring WebFlux 框架”
        • 8.2.2. 嵌入式反应式服务器支持
        • 8.2.3. 反应式服务器资源配置
      • 8.3. 优雅关机
      • 8.4. spring安全
        • 8.4.1. MVC安全
        • 8.4.2. WebFlux 安全
        • 8.4.3. OAuth2
        • 8.4.4. SAML 2.0
      • 8.5. spring 会话
      • 8.6.GraphQL
      • 8.7. Spring HATEOAS
      • 8.8.接下来读什么
    • 9. 数据
      • 9.1. SQL数据库
      • 9.2. 使用 NoSQL 技术
      • 9.3. 接下来读什么
    • 10. 消息
      • 10.1. JMS
      • 10.2. AMQP
      • 10.3. Apache Kafka 支持
      • 10.4. Apache Pulsar 支持
      • 10.5. RSocket
      • 10.6. Spring Integration
      • 10.7. WebSockets
      • 10.8. What to Read Next
    • 11. IO
      • 11.1. 缓存
      • 11.2. Hazelcast
      • 11.3. Quartz 调度程序
      • 11.4. 发送电子邮件
      • 11.5. 验证
      • 11.6. 调用 REST 服务
      • 11.7. web services
      • 11.8. 使用 JTA 进行分布式事务
      • 11.9. 接下来读什么
    • 12. 容器镜像
  • Spring核心功能
    • 1.IOC容器和Bean简介
      • 1.2. 容器概述
      • 1.3. Bean概述
      • 1.4. 依赖项
        • 1.4.1. 依赖注入
        • 1.4.2. 详细的依赖关系和配置
        • 1.4.3. 使用depends-on
        • 1.4.4. 延迟初始化的 Bean
        • 1.4.5. 自动装配协作者
        • 1.4.6. 方法注入
    • 2. Resources
      • 2.1. 介绍
      • 2.2. Resource接口
      • 2.3. 内置Resource实现
      • 2.4. ResourceLoader接口
      • 2.5. ResourcePatternResolver接口
      • 2.6. ResourceLoaderAware接口
      • 2.7. 资源作为依赖
      • 2.8. 应用程序上下文和资源路径
    • 3. 验证、数据绑定和类型转换
      • 3.1. 使用 Spring 的 Validator 接口进行验证
      • 3.2. 将代码解析为错误消息
      • 3.3. Bean 操作和BeanWrapper
      • 3.4. spring类型转换
      • 3.5. spring字段格式
      • 3.6. 配置全局日期和时间格式
      • 3.7. Java Bean 验证
    • 4. SpEL表达式
    • 5. Spring 面向切面编程
      • 5.1. AOP 概念
      • 5.2. Spring AOP 的能力和目标
      • 5.3. AOP 代理
      • 5.4. @AspectJ 支持
        • 5.4.1. 启用@AspectJ 支持
        • 5.4.2. 声明一个切面
        • 5.4.3. 声明切入点
        • 5.4.4. 声明切点
        • 5.4.5. 切面说明
        • 5.4.6. 切面实例化模型
        • 5.4.7. AOP 示例
      • 5.5. 基于模式的 AOP 支持
      • 5.6. 选择要使用的 AOP 声明样式
      • 5.7. 混合切面类型
      • 5.8. 代理机制
      • 5.9. @AspectJ 代理的程序化创建
      • 5.10. 在 Spring 应用程序中使用 AspectJ
      • 5.11.更多资源
    • 6. Spring AOP API
      • 6.1. Spring中的切入点API
      • 6.2. Spring 中的 Advice API
      • 6.3. Spring 中的 Advisor API
      • 6.4. 使用ProxyFactoryBean创建 AOP 代理
      • 6.5. 简洁的代理定义
      • 6.6. 以编程方式创建 AOP 代理ProxyFactory
      • 6.7. 操作切面对象
      • 6.8. 使用“自动代理”工具
      • 6.9. 使用TargetSource实现
      • 6.10. 定义新的切面类型
    • 7. 空指针安全
    • 8. 数据缓冲器和编解码器
    • 9. 日志
    • 10. 附录
      • 10.1. XML 模式
      • 10.2. 自定义XML Schema
        • 10.2.1. 创作 Schema
        • 10.2.2. 编码一个NamespaceHandler
        • 10.2.3. 使用BeanDefinitionParser
        • 10.2.4. 注册处理程序和模式
        • 10.2.5. 在 Spring XML 配置中使用自定义扩展
        • 10.2.6. 更详细的例子
      • 10.3. 应用程序启动步骤
  • 使用redis实现分布式锁
  • Java 安全标准算法名称
  • JDK 9 JEP
  • JDK 10 JEP
  • 人件
    • 《人件》
    • 第一部分 管理人力资源
      • 01 此时此刻,一个项目正在走向失败
      • 02 干酪汉堡,做一个,卖一个
      • 03 维也纳在等你
      • 04 质量——如果时间允许
      • 05 再谈帕金森定律
      • 06 苦杏素
    • 第二部分 办公环境
      • 07 家具警察
      • 08 “朝九晚五在这里啥也完成不了。”
      • 09 在空间上省钱
      • 间奏曲:生产效率度量和不明飞行物
      • 10 大脑时问与身体时间
      • 11 电话
      • 12 门的回归
      • 13 采取保护步骤
    • 第三部分 正确的人
      • 14 霍恩布洛尔因素
      • 15 谈谈领导力
      • 16 雇一名杂耍演员
      • 17 与他人良好合作
      • 18 童年的终结
      • 19 在这儿很开心
      • 20 人力资本
    • 第四部分 高效团队养成
      • 21 整体大于部分之和
      • 22 黑衣团队
      • 23 团队自毁
      • 24 再谈团队自毁
      • 25 竞争
      • 26 一顿意面晚餐
      • 27 敞开和服
      • 28 团队形成的化学反应
    • 第五部分 沃土
      • 29 自我愈复系统
      • 30 与风险共舞
      • 3l 会议、独白和交流
      • 32 终极管理罪恶得主是……
      • 33 “邪恶”电邮
      • 34 让改变成为可能
      • 35 组织型学习
      • 36 构建社区
    • 第六部分 快乐地工作
      • 37 混乱与秩序
      • 38 自由电子
      • 39 霍尔加·丹斯克
由 GitBook 提供支持
在本页

这有帮助吗?

在GitHub上编辑
  1. spring boot参考文档

12. 容器镜像

上一页11.9. 接下来读什么下一页Spring核心功能

最后更新于1年前

这有帮助吗?

Spring Boot 应用程序可以进行容器化,或者,例如Kubernetes。

12.1. 高效的容器镜像

可以轻松地将 Spring Boot uber jar 打包为 docker 镜像。然而,像在 docker 镜像中那样复制和运行 uber jar 存在各种缺点。在不解压的情况下运行 uber jar 总是会产生一定量的开销,并且在容器化环境中这可能会很明显。另一个问题是,将应用程序的代码及其所有依赖项放在 Docker 映像的一层中并不是最佳选择。由于您重新编译代码的频率可能比升级所使用的 Spring Boot 版本的频率高,因此最好将各个部分分开一些。如果将 jar 文件放在应用程序类之前的层中,Docker 通常只需要更改最底层,就可以从其缓存中选取其他层。

12.1.1. 对 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.

12.2. Dockerfile

Layertools 模式不能与包含启动脚本的完全可执行的 Spring Boot 存档一起使用。构建打算与 Layertools一起使用的 jar 文件时,禁用启动脚本配置。

以下是如何使用layertools jar 模式启动 jar 的方法:

$ java -Djarmode=layertools -jar my-app.jar

这将提供以下输出:

Usage:
  java -Djarmode=layertools -jar my-app.jar
​
Available commands:
  list     List layers from the jar that can be extracted
  extract  Extracts layers from the jar for image creation
  help     Help about any command

extract命令可用于轻松地将应用程序拆分为多个层以添加到 dockerfile 中。以下是使用 jarmode的 Dockerfile 示例。

FROM eclipse-temurin:17-jre as builder
WORKDIR application
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} application.jar
RUN java -Djarmode=layertools -jar application.jar extract
​
FROM eclipse-temurin:17-jre
WORKDIR application
COPY --from=builder application/dependencies/ ./
COPY --from=builder application/spring-boot-loader/ ./
COPY --from=builder application/snapshot-dependencies/ ./
COPY --from=builder application/application/ ./
ENTRYPOINT ["java", "org.springframework.boot.loader.launch.JarLauncher"]

假设以上Dockerfile内容位于当前目录中,则可以使用docker build . 构建 docker 映像,或者可以选择指定应用程序 jar 的路径,如以下示例所示:

$ docker build --build-arg JAR_FILE=path/to/myapp.jar .

这是一个多阶段的 dockerfile。构建器阶段提取稍后需要的目录。每个COPY命令都与 jarmode 提取的层相关。

当然,不使用jarmode也可以编写Dockerfile。您可以使用unzip和mv的某种组合将内容移动到正确的层,但 jarmode 简化了这一点。

12.3. 云原生构建包

Dockerfile 只是构建 Docker 镜像的一种方式。构建 docker 镜像的另一种方法是使用 buildpacks 直接从 Maven 或 Gradle 插件。如果您曾经使用过 Cloud Foundry 或 Heroku 等应用程序平台,那么您可能使用过构建包。Buildpack 是平台的一部分,它接受您的应用程序并将其转换为平台可以实际运行的内容。例如,Cloud Foundry 的 Java buildpack 会注意到您正在推送.jar文件并自动添加相关的 JRE。

借助 Cloud Native Buildpack,您可以创建可在任何地方运行的 Docker 兼容映像。Spring Boot 包括直接对 Maven 和 Gradle 的构建包支持。这意味着您只需键入一个命令,即可快速将合理的镜像添加到本地运行的 Docker 守护进程中。

为了实现可重复的构建和容器映像缓存,Buildpacks 可以操作应用程序资源元数据(例如文件“上次修改”信息)。您应该确保您的应用程序在运行时不依赖该元数据。Spring Boot 在提供静态资源时可以使用该信息,但可以使用spring.web.resources.cache.use-last-modified.

12.4. 接下来读什么

对于 Maven,请参阅了解有关向存档添加层索引的更多详细信息。对于 Gradle,请参阅Gradle 插件文档的

虽然只需在 Dockerfile 中添加几行代码就可以将 Spring Boot uber jar 转换为 docker 镜像,但我们将使用来创建优化的 docker 镜像。当您创建包含图层索引文件的 jar 时,spring-boot-jarmode-layertoolsjar 将作为依赖项添加到您的 jar 中。将此 jar 放在类路径中,您可以在特殊模式下启动应用程序,该模式允许引导代码运行与应用程序完全不同的东西,例如提取层的东西。

和结合使用的各个插件文档。

Paketo 支持layers.idx文件,因此应用于该文件的任何自定义都将反映在该构建包创建的映像中。

一旦您了解了如何构建高效的容器映像,您就可以阅读有关(例如 Kubernetes)的信息。

使用 Dockerfile
使用 Cloud Native Buildpack 来创建可在任何地方运行的优化的 docker 兼容容器映像
打包分层 jar 或 war 部分,
打包分层 jar 或 war 部分。
分层功能
请参阅有关如何将构建包与Maven
Gradle
Spring Boot 构建包
将应用程序部署到云平台