我的编程空间,编程开发者的网络收藏夹
学习永远不晚

怎么进行Spring Boot 分层打包Docker 镜像实践及分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

怎么进行Spring Boot 分层打包Docker 镜像实践及分析

本篇文章给大家分享的是有关怎么进行Spring Boot 分层打包Docker 镜像实践及分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

1. 准备 spring boot 项目

简单,略过
spring boot 版本 > 2.3.x 即可
简单写了一个 hello world

怎么进行Spring Boot 分层打包Docker 镜像实践及分析

2. 进行相关配置

这里网上很多 blog 都强调了要去 pom.xml 里手动配置启用分层打包:

<build>    <plugins>        <plugin>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-maven-plugin</artifactId>            <configuration>                <!--开启分层编译支持-->                <layers>                    <enabled>true</enabled>                </layers>            </configuration>        </plugin>    </plugins></build>

x版本的时候因为是新功能需要手动配置开启。但是目前 spring boot 版本(使用版本2.6.1)实测不需要手动配置,默认支持该特性。(根据一些 blog 的说法是 2.4.x 版本之后就默认开启了)

目前的官方文档(2.6.0版本)的说法也是默认支持,反而不需要该特性时才需要手动配置:

The repackaged archive includes the layers.idx file by default. To disable this feature, you can do so in the following manner:

<project>   <build>       <plugins>           <plugin>               <groupId>org.springframework.boot</groupId>               <artifactId>spring-boot-maven-plugin</artifactId>               <configuration>                   <layers>                       <enabled>false</enabled>                   </layers>               </configuration>           </plugin>       </plugins>   </build></project>

3. package

执行 mvn package 进行打包,得到 jar 包文件。

怎么进行Spring Boot 分层打包Docker 镜像实践及分析

其实实际上本质是使用了 spring-boot-maven 插件的 repackage,得到了完整的包含依赖的 jar 包和原始的 jar 包(自动添加后缀 .original)
打开 jar 包,会发现在 BOOT-INF 文件夹下有 classpath.idxlayers.idx 文件,打开看下:

classpath.idx

- "BOOT-INF/lib/logback-classic-1.2.7.jar"

- "BOOT-INF/lib/logback-core-1.2.7.jar"

- "BOOT-INF/lib/log4j-to-slf4j-2.14.1.jar"

- "BOOT-INF/lib/log4j-api-2.14.1.jar"

- "BOOT-INF/lib/jul-to-slf4j-1.7.32.jar"

- "BOOT-INF/lib/jakarta.annotation-api-1.3.5.jar"

- "BOOT-INF/lib/snakeyaml-1.29.jar"

- "BOOT-INF/lib/jackson-databind-2.13.0.jar"

- "BOOT-INF/lib/jackson-annotations-2.13.0.jar"

- "BOOT-INF/lib/jackson-core-2.13.0.jar"

- "BOOT-INF/lib/jackson-datatype-jdk8-2.13.0.jar"

- "BOOT-INF/lib/jackson-datatype-jsr310-2.13.0.jar"

- "BOOT-INF/lib/jackson-module-parameter-names-2.13.0.jar"

- "BOOT-INF/lib/tomcat-embed-core-9.0.55.jar"

- "BOOT-INF/lib/tomcat-embed-el-9.0.55.jar"

- "BOOT-INF/lib/tomcat-embed-websocket-9.0.55.jar"

- "BOOT-INF/lib/spring-web-5.3.13.jar"

- "BOOT-INF/lib/spring-beans-5.3.13.jar"

- "BOOT-INF/lib/spring-webmvc-5.3.13.jar"

- "BOOT-INF/lib/spring-aop-5.3.13.jar"

- "BOOT-INF/lib/spring-context-5.3.13.jar"

- "BOOT-INF/lib/spring-expression-5.3.13.jar"

- "BOOT-INF/lib/spring-boot-2.6.1.jar"

- "BOOT-INF/lib/spring-boot-autoconfigure-2.6.1.jar"

- "BOOT-INF/lib/slf4j-api-1.7.32.jar"

- "BOOT-INF/lib/spring-core-5.3.13.jar"

- "BOOT-INF/lib/spring-jcl-5.3.13.jar"

- "BOOT-INF/lib/spring-boot-jarmode-layertools-2.6.1.jar"

layers.idx

- "dependencies":

  - "BOOT-INF/lib/"

- "spring-boot-loader":

  - "org/"

- "snapshot-dependencies":

- "application":

  - "BOOT-INF/classes/"

  - "BOOT-INF/classpath.idx"

  - "BOOT-INF/layers.idx"

  - "META-INF/"

再验证一下:

怎么进行Spring Boot 分层打包Docker 镜像实践及分析

分层信息 ok

4. Dockerfile

Dockerfile 文件也相对常规,只是在打包镜像之前使用 jarmode 命令把 jar 包解压了,然后在打包镜像过程中将不同层依次 COPY,将改动可能性最大的应用层放在最后,这样前面的没有变化就可以直接使用 Docker 的缓存以提高打包效率。

FROM eclipse-temurin:8-jre-focal 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:8-jre-focal  

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/ ./  

ENV TZ="Asia/Shanghai"  

RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone  

ENV JVM_OPTS=""  

ENV JAVA_OPTS=""  

ENTRYPOINT ["sh","-c","java $JVM_OPTS $JAVA_OPTS org.springframework.boot.loader.JarLauncher"]

5. 应用程序修改&dive分析

其实如果只打包一次镜像是没有体现分层的优势的,所以需要修改部分内容后再打包一次(或者多次,但是本质是一样的所以这里只修改了一次)
修改部分应用代码:

怎么进行Spring Boot 分层打包Docker 镜像实践及分析

重新打 jar 包&重新打镜像,这样得到了两个镜像:

怎么进行Spring Boot 分层打包Docker 镜像实践及分析

使用 dive 对两个镜像进行分析:

怎么进行Spring Boot 分层打包Docker 镜像实践及分析

怎么进行Spring Boot 分层打包Docker 镜像实践及分析

怎么进行Spring Boot 分层打包Docker 镜像实践及分析

可以发现:直到发生改变的应用层(application/application/)之前,两边的分层的 Id、Digest 都是完全一致的,所以这些层是可以复用的,相同的层只会在 docker 的目录下存储单个,如此可以大大减少容器编译、推送的时长。

以上就是怎么进行Spring Boot 分层打包Docker 镜像实践及分析,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

怎么进行Spring Boot 分层打包Docker 镜像实践及分析

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么进行Spring Boot 分层打包Docker 镜像实践及分析

本篇文章给大家分享的是有关怎么进行Spring Boot 分层打包Docker 镜像实践及分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1. 准备 spring boot
2023-06-22

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录