写点什么

详解 SpringBoot(2,java 入门视频教学

用户头像
极客good
关注
发布于: 刚刚

[](

)本篇简介


在[前文](


),咱们快速体验了官方推荐的 docker 镜像制作方案,但也产生了几个疑问:


  1. SpringBoot-2.3 版本推荐的镜像构建方案和旧版本比有


【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


什么不同?


  1. pom.xml 中 spring-boot-maven-plugin 插件新增的参数,到底做了什么?

  2. Dockerfile 中,java -Djarmode=layertools -jar application.jar extract 这个操作啥意思?


本篇的目标就是解答上述问题,在寻找答案的过程中不断补全知识点,提升自己;

[](

)关键知识点:镜像 layer


前文多次提到的镜像 layer 到底是什么,为什么会有多层 layer?有必要先把这个知识点夯实了,请参考文章[《SpringBoot-2.3 镜像方案为什么要做多个 layer》](


)

[](

)老版本 SpringBoot 的官方方案


以 SpringBoot-2.2.0.RELEASE 版本为例,官方文档(


https://docs.spring.io/spring-boot/docs/2.2.0.RELEASE/reference/pdf/spring-boot-reference.pdf)给出的做法如下:


  1. 将 SpringBoot 工程编译构建,在 target 目录得到 jar;

  2. 在 target 目录新建 dependency 文件夹;

  3. 将 jar 解压到 dependency 文件夹;

  4. 编写 Dockerfile 文件,内容如下:


FROM openjdk:8-jdk-alpine


VOLUME /tmp


ARG DEPENDENCY=target/dependency


COPY ${DEPENDENCY}/BOOT-INF/lib /app/lib


COPY ${DEPENDENCY}/META-INF /app/META-INF


COPY ${DEPENDENCY}/BOOT-INF/classes /app


ENTRYPOINT ["java","-cp","app:app/lib/*","com.example.MyApplication"]


  1. 可见,官方推荐的做法是将整个 jar 文件解压,在 Dockerfile 中多次用 COPY 命令分别复制,这样做的好处显而易见:多个 layer,如果镜像的新版本中只修改了应用代码,那么下载镜像时只会下载/app 这个 layer,其他部分直接使用本地缓存,这是 docker 镜像的常规优化手段;

  2. 上述方案有个小问题:麻烦!!!

  3. 于是 2.3.0.RELEASE 版本做了些优化,让事情变得简单些;

[](

)2.3.0.RELEASE 版本方案和旧版的区别


2.3.0.RELEASE 版本构建 Docker 的步骤如下:


  1. pom.xml 中的 spring-boot-maven-plugin 插件增加一个配置项;


2.编译构建生成 jar;


  1. 编写 Dockerfile,里面用到了多阶段构建(multi-stage builds),用工具从 jar 中提取拆分后,再多次执行 COPY 命令将拆分后的内容放入镜像,达到多个 layer 的目的;


因此,2.3.0.RELEASE 版本和旧版本相比有如下变化:


  1. pom.xml 中多了个参数;

  2. 构建好 jar 后,无需自己解压 jar;

  3. Dockefile 内容不一样,旧版是手动解压 jar,再在 Dockerfile 分别复制,2.3.0.RELEASE 是通过 java 命令从 jar 中提取出各部分内容;


搞清楚了新旧版本的区别,咱们继续研究下一个问题吧;

[](

)pom.xml 中 spring-boot-maven-plugin 插件新增的参数


  1. pring-boot-maven-plugin 插件新增参数如下图所示:



  1. 上述参数有啥用?我这边编译构建了两次 jar,第一次有上述参数,第二次没有,将两次生成的 jar 解压后对比,发现用了上述参数后,生成的 jar 会多出下图红框中的两个文件:



  1. 看看 layers.idx 文件的内容,如下图:



  1. 上图中的内容分别是什么意思呢?官方已给出了详细解释,如下图红框:



  1. 综上所述,layers.idx 文件是个清单,里面记录了所有要被复制到镜像中的信息,接下来看看如何使用 layers.idx 文件,这就涉及到 jar 包中新增的另一个文件:spring-boot-jarmode-layertools-2.3.0.RELEASE.jar

[](

)spring-boot-jarmode-layertools 工具


  1. 前面已经介绍过 jar 中除了 layers.idx,还多了个文件:spring-boot-jarmode-layertools-2.3.0.RELEASE.jar ,来看看这个文件的用处;

  2. 进入工程的 target 目录,这里面是编译后的 jar 文件(我这里文件名为 dockerlayerdemo-0.0.1-SNAPSHOT.jar),注意此时的 spring-boot-maven-plugin 插件是带上了下图红框中的参数的:



  1. 执行以下命令:


java -Djarmode=layertools -jar dockerlayerdemo-0.0.1-SNAPSHOT.jar list

用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
详解SpringBoot(2,java入门视频教学