springboot服务docker打包分层的实现
前言
随着云原生技术的发展,现在大部分企业项目都通过容器化来部署项目,不管是docker部署还是k8s都离不开打镜像的环节,传统打镜像的方式通常时间上会比较漫长,有时候改动少量代码就需要全部打包。今天来体验一下Springboot2.3.0后的分层打包功能。
普通打包
我们先新建一个添加了springboot依赖的maven测试项目,对于诸位老Javaboy来说属于闭着眼操作了,默认的maven项目里一般不会自动添加上打包插件。最开始接触springboot的时候使用maven package打出来jar包启动会发现报错找不到入口类。
所以一定要在pom中加上
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.uptown.sign.SignApplication</mainClass>
<layout>ZIP</layout>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
随便写一个hello world的控制器入口,然后直接编写Dockerfile文件
FROM openjdk:8-jdk-alpine # 打包命令 RUN mvn package # 声明一个端口但不真正运行在这个端口 EXPOSE 8080 # 把打出来的包添加到镜像中 ADD target/*.jar ./app.jar # 执行命令 CMD java -jar app.jar
完事之后运行命令打成镜像测试
docker build . -t test:0.0.1
打出镜像后查看镜像的分层结构。
docker inspect test:0.0.1

图中的Layers就是镜像层,docker是会按命令分层,我们把hello world改成fu ck work,重新执行下上述步骤再docker inspect分析下新镜像的Layers会发现

你会发现这些Layers中只有最后一处与旧镜像内容不一样,我们仅仅只改动了一个接口返回的文案,重新打包后会把所有动作重新都做一边,做完后发现打出来的镜像每层基本都一样,只有最后一层有变化,那么我们能不能只重新制作有变化的包呢。
分层打包
当然是可以了,这就是springboot在230加的新特性,虽然现在springboot版本已经出道3了,但是我认为越迭代越重,加了很多可有可无的东西,不如老版本中一些好用的特性值得把玩。
根本原理其实是一个springboot打出jar包中主要包含四个部分,自己写的代码,第三方依赖、SpringBoot内部配置、快照依赖 ,如果仅仅只是改动了自己写的代码的话那其他那三部分根本不用变。也就是说如果你换了依赖版本那就不行了。
首先在pom中打开分层开关
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<layers>
<enabled>true</enabled>
</layers>
</configuration>
</plugin>
</plugins>
</build>
再用mvn package打包之后我们用命令分析下jar包内容
java -Djarmode=layertools -jar target/dockers-demo-0.0.1-SNAPSHOT.jar list

这里就分别对应了上述那四个部分代码,所以如果只更改部分代码的话并不需要再将依赖相关的代码编译上次编译完的直接用呗。
FROM openjdk:8-jdk-alpine RUN mvn package ADD target/*.jar ./app.jar RUN java -Djarmode=layertools -jar app.jar extract FROM openjdk:8-jre WORKDIR application # 复制第三方依赖、SpringBoot内部配置、快照依赖 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"]
改造后你再去打包会发现特别快,springboot好用就在于内置了很多依赖包,跨过依赖包单独打业务代码快的一批,但是仅在依赖版本未发生变更的场景下生效。
到此这篇关于springboot服务docker打包分层的实现的文章就介绍到这了,更多相关springboot docker打包分层内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Linux系统Docker 部署 ASP.NET Core应用的流程分析
这篇文章主要介绍了Linux系统Docker 部署 ASP.NET Core应用的流程分析,在操作过程中小编遇到很多问题,下面把我的经验及处理方法分享到脚本之家平台,需要的朋友参考下吧2021-06-06
Docker安装Redis并使用Another Redis Desktop Manager连接的方法
Redis 是一个使用C语言编写的、开源的(遵守 BSD 协议)、高性能的、支持网络、可基于内存亦可持久化的日志型、Key-Value的NoSQL数据库,这篇文章主要介绍了Docker安装Redis并使用Another Redis Desktop Manager连接,需要的朋友可以参考下2022-09-09
Docker如何使用nginx搭建tomcat集群(图文详解)
这篇文章主要介绍了Docker使用nginx搭建tomcat集群的教程,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下2019-12-12


最新评论