这期内容当中小编将会给大家带来有关SpringBoot(2.3)应用制作Docker镜像的过程,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
以<font color="blue">SpringBoot-2.2.0.RELEASE</font>版本为例,官方文档( https://docs.spring.io/spring-boot/docs/2.2.0.RELEASE/reference/pdf/spring-boot-reference.pdf)给出的做法如下:
将SpringBoot工程编译构建,在target目录得到jar;
在target目录新建dependency文件夹;
将jar解压到dependency文件夹;
编写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"]
可见,官方推荐的做法是将整个jar文件解压,在Dockerfile中多次用COPY命令分别复制,这样做的好处显而易见:多个layer,如果镜像的新版本中只修改了应用代码,那么下载镜像时只会下载/app这个layer,其他部分直接使用本地缓存,这是docker镜像的常规优化手段;
上述方案有个小问题:<font color="red">麻烦!!!</font>
于是2.3.0.RELEASE版本做了些优化,让事情变得简单些;
2.3.0.RELEASE版本构建Docker的步骤如下:
pom.xml中的spring-boot-maven-plugin插件增加一个配置项; 2.编译构建生成jar;
编写Dockerfile,里面用到了多阶段构建(multi-stage builds),用工具从jar中提取拆分后,再多次执行COPY命令将拆分后的内容放入镜像,达到多个layer的目的;
因此,2.3.0.RELEASE版本和旧版本相比有如下变化:
<font color="blue">pom.xml</font>中多了个参数;
构建好jar后,无需自己解压jar;
Dockefile内容不一样,旧版是手动解压jar,再在Dockerfile分别复制,2.3.0.RELEASE是通过<font color="red">java命令从jar中提取出各部分内容</font>;
搞清楚了新旧版本的区别,咱们继续研究下一个问题吧;
pring-boot-maven-plugin插件新增参数如下图所示:
2. 上述参数有啥用?我这边编译构建了两次jar,第一次有上述参数,第二次没有,将两次生成的jar解压后对比,发现用了上述参数后,生成的jar会多出下图红框中的两个文件:
看看<font color="blue">layers.idx</font>文件的内容,如下图:
上图中的内容分别是什么意思呢?官方已给出了详细解释,如下图红框:
综上所述,layers.idx文件是个清单,里面记录了所有要被复制到镜像中的信息,接下来看看如何使用layers.idx文件,这就涉及到jar包中新增的另一个文件:<font color="blue">spring-boot-jarmode-layertools-2.3.0.RELEASE.jar</font>
前面已经介绍过jar中除了layers.idx,还多了个文件:<font color="blue">spring-boot-jarmode-layertools-2.3.0.RELEASE.jar</font> ,来看看这个文件的用处;
进入工程的<font color="blue">target</font>目录,这里面是编译后的jar文件(我这里文件名为dockerlayerdemo-0.0.1-SNAPSHOT.jar),注意此时的<font color="blue">spring-boot-maven-plugin</font>插件是带上了下图红框中的参数的:
执行以下命令:
java -Djarmode=layertools -jar dockerlayerdemo-0.0.1-SNAPSHOT.jar list
得到结果如下图所示,是layers.idx文件的内容:
来看看官方对这个<font color="blue">layertools</font>的解释,list参数的作用上面我们已经体验过了,重点是红框中的<font color="red">extract</font>参数,它的作用是从jar中提取构建镜像所需的内容:
看到这里,您是否想到了《体验SpringBoot(2.3)应用制作Docker镜像(官方方案)》中Dockerfile的内容,请看下图的红框和红字,是否有种恍然大悟的感觉:jar构建生成清单layers.idx,Dockerfile中根据清单从jar提取文件放入镜像:
至此,三个问题都已经找到了答案,小结一下:
pom.xml中的spring-boot-maven-plugin插件增加一个配置项;
构建好jar后,旧版本要自己解压jar,新版不需要;
新版本的jar中,多了个文件清单<font color="blue">layers.idx</font>和镜像文件处理工具<font color="blue">spring-boot-jarmode-layertools-2.3.0.RELEASE.jar</font>;
旧版的Dockefile内容:因为前面解压好了,所有在Dockerfile里直接复制前面解压的内容,这里就有个风险:前一步解压和当前复制的文件位置要保证一致;
新版的Dockerfile内容:使用工具spring-boot-jarmode-layertools-2.3.0.RELEASE.jar,根据的layers.idx内容从jar中提取文件,复制到镜像中;
新版的Dockerfile中,由于使用了分阶段构建,因此从jar提取文件的操作不会保存到镜像的layer中;
spring-boot-maven-plugin插件新增的参数,使得编译构建得到jar中多了两个文件,如下图所示:
<font color="blue">java -Djarmode=layertools -jar application.jar extract</font>的作用是从jar中提取文件,这些文件是docker镜像的一部分;
上述操作的参数是<font color="blue">extract</font>,另外还有两个参数,官方解释它们的作用如下:
至此,问题已全部澄清,相信您对SpringBoot-2.3.0.RELEASE官方的镜像构建方案也足够了解了,最后是我根据自己的认识画的流程图,帮助您快速理解整个构建流程:
上述就是小编为大家分享的SpringBoot(2.3)应用制作Docker镜像的过程了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。