Spring Boot官方推荐的Docker镜像编译方式-分层jar包
创始人
2024-02-02 08:17:08

目录

  • 参考
  • 一、普通Dockerfile的缺点
  • 二、Docker分层
  • 三、Spring Boot分层
  • 四、实践
    • 核心理论
    • 新建demo工程
      • pom.xml
    • 测试代码
    • 编写Dockerfile
    • 我们在项目根目录执行打包命令
    • 发布docker镜像
    • 修改代码重新发布docker

参考

Spring Boot官方推荐的Docker镜像编译方式-分层jar包
Spring Boot layered(分层) jar 构建docker镜像
Spring Boot独立运行的jar包是如何工作的

一、普通Dockerfile的缺点

我们通常情况下要编译Spring Boot的Docker镜像,一般会写一个下面这样的Dockerfile

FROM openjdk:17
EXPOSE 8080
ARG JAR_FILE=target/my-application.jar #Maven的位置,Gradle为build/libs/my-application.jar 
ADD ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

这样做很简单,运行起来也没什么问题,但是它有以下的缺点:

  • 镜像中的jar包是压缩文件,在容器环境中运行需要解压,这需要相当的开销,我们的jar通常要以解压后的形式运行更好。
  • 更新程序后编译新的镜像效率低。Docker镜像的编译时分层构建的,而上面将依赖和程序都放在一个层中。在实际应用中,修改程序编译代码的频率将大大高于依赖的变化,所以我们最好将它们分在不同的层,这样不变的层在docker中可以直接使用缓存。

二、Docker分层

Docker 容器由基本映像和附加层组成。一旦构建了各个层,它们将保持缓存状态,后续构建,就会使用缓存,构建更快

在这里插入图片描述

低层次的变化也会重建较高层次的变化。因此,我们在构建镜像的时候最好将不经常变化的图层保留在底部,而经常变化的图层应该放在顶部。这样就能提高构建docker效率和启动时间。

三、Spring Boot分层

Spring boot 在2.3之后也提供了应用分层,默认分层如下
在这里插入图片描述

这里可以看到应用层是独立一层,我们在修改应用代码的时候就只用构建应用层即可。 spring-boot-loader 、 dependencies 层就可以使用缓存,从而减少docker镜像的创建和启动时间。

四、实践

核心理论

在Spring Boot 2.3之后添加了分层配置我们在打包插件【spring-boot-maven-plugin】中开启分层打包

true

org.springframework.bootspring-boot-maven-plugin${spring-boot.version}truerepackage

新建demo工程

pom.xml


spirng-boot-democom.demo1.0.04.0.0spring-boot-kuberntes-docker1111org.springframework.bootspring-boot-starter-weborg.apache.maven.pluginsmaven-compiler-plugin1111org.springframework.bootspring-boot-maven-plugin${spring-boot.version}truerepackage

测试代码

测试代码
Application
@SpringBootApplication
public class  Application  { public  static  void  main(String[] args)  { TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));SpringApplication.run(Application.class, args);}
}
...
...
TestController
@RestController
@RequestMapping
public class  TestController  { @GetMapping("test")public String test() { return "hello docker image";}
}

编写Dockerfile

from openjdk:8 as builder
# 执行工作目录
WORKDIR application
# 将编译构建得到的jar文件复制到镜像空间中
copy target/edevp-store-biz-0.0.1.jar application.jar
expose 8101
# 通过工具spring-boot-jarmode-layertools从application.jar中提取拆分后的构建结果
RUN java -Djarmode=layertools -jar application.jar extract
# 正式构建镜像
FROM openjdk:8
WORKDIR application
# 前一阶段从jar中提取除了多个文件,这里分别执行COPY命令复制到镜像空间中,每次COPY都是一个layer
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.JarLauncher"]

我们在项目根目录执行打包命令

mvn clean package -U -DskipTests

在这里插入图片描述

如果我们解压我们的jar就会发现多了 layers.idx 文件,打开文件我们会发现有如下内容

dependencies
spring-boot-loader
snapshot-dependencies
application

在这里插入图片描述

发布docker镜像

在这里插入图片描述

修改代码重新发布docker

在这里插入图片描述
第一次构建可能会有点慢,如果我们后续改了文件重新打包成镜像会快很多,因为有缓存,我们打包又是分了层,这种分层方式比打整个jar包的方式大概能快1倍的速度左右,具体性能差异还是要自己多测试

相关内容

热门资讯

脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...