当前位置: 首页 > Web前端 > JavaScript

SpringBoot分层(layered)jar构建docker镜像

时间:2023-03-27 13:54:16 JavaScript

文章目录DockerLayeredDocker容器由基础镜像和附加层组成。构建层后,它们将保持缓存状态,后续构建将使用缓存来加快构建速度。较低级别的更改也将重建较高级别的更改。因此,我们在构建镜像时,最好将不经常变化的层放在最底层,而经常变化的层应该放在最上面。这提高了构建docker的效率和启动时间。SpringBoot分层Springboot在2.3之后也提供了应用分层。默认分层如下。这里可以看到应用层是一个独立的层。当我们修改应用代码时,只需要构建应用层即可。spring-boot-loader和dependencies层可以使用缓存,从而减少docker镜像的创建和启动时间。分层封装传统封装org.apache.maven.pluginsmaven-compiler-plugin1111org.springframework.bootspring-boot-maven-plugin${spring-boot.version}重新打包这种方法是把整个SpringBoot打成一个jar,在SpringB中没有分层root2.3之后增加了分层配置我们在打包插件中启用分层打包分层打包org.apache.maven.pluginsmaven-compiler-plugin1111org.springframework.bootspring-boot-maven-plugin${spring-boot.version}true<执行><执行><目标><目标>重新打包这样创建的jar分层创建SpringBootdemo工程工程结构pom依赖spirng-boot-kubernetescom.zou1.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@SpringBootApplicationpublicclassApplication{publicstaticvoidmain(String[]args){TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));SpringApplication.run(Application.class,args);}}TestController@RestController@RequestMappingpublicclassTestController{@GetMapping("test")publicStringtest(){return"hellodockerimage";}}WriteDockerfile#指定基础镜像,为阶段性构建的前期FROMadoptopenjdk/openjdk11asbuilder#执行工作目录WORKDIRapplication#配置参数ARGJAR_FILE=target/*.jar#编译并编译构建获取jar文件到镜像空间COPY${JAR_FILE}application.jar#通过spring-boot-jarmode-layertools工具从application.jar中提取拆分构建结果RUNjava-Djarmode=layertools-jarapplication.jarextract#正式构建镜像FROMadoptopenjdk/openjdk11WORKDIRapplication#上一阶段除了从jar中提取多个文件外,这里执行COPY命令复制到镜像空间,每个COPY为一层COPY--from=builderapplication/dependencies/./COPY--from=builderapplication/spring-boot-loader/./COPY--from=builderapplication/snapshot-dependencies/./COPY--from=builderapplication/application/./ENTRYPOINT["java",“org.springframework.boot.loader.JarLauncher"]我们在项目根目录下执行打包命令mvncleanpackage-U-DskipTests。如果我们解压我们的jar,我们会发现有更多的layers.idx文件。打开文件我们会发现如下内容dependenciesspring-boot-loadersnapshot-dependenciesapplicationbuilddockerimage我们在Dockerfile的根目录执行如下命令dockerbuild-tdockerlayerdemo:0.0.5。第一次构建可能有点慢。如果我们改一下文件,重新打包成镜像,会快很多。因为有缓存,我们把它打包成层。这种分层方式比整个jar包方式可以快1倍左右。具体的性能差异还是需要自己去测试。运行docker镜像执行如下命令dockerrun-d-p8080:8080dockerlayerdemo:0.0.5启动完成后,我们访问测试界面localhost:8080/test,可以看到自定义层可以正常访问。如果我们仔细看上面,我们会发现在构建的时候并不会共享依赖,所以我们需要自定义配置调整接下来,在SpringBoot中,我们可以通过配置文件来调整自定义分层。我们创建一个layers.xmlorg/springframework/boot/loader/***:*:*SNAPSHOT依赖项spring-boot-loadersn??apshot-dependenciesapplication然后在maven中指定配置文件<插件>org.springframework.bootspring-boot-maven-plugintrue${project.basedir}/src/layers.xml这样我们就可以自定义分层了。总的来说,构建一个高效的Docker镜像并没有那么简单,还有很多知识需要学习研究,如果以后有机会继续深入研究,对内容感兴趣的朋友文章的可以搜索微信公众号:敲代码的老贾,收到了相应的信息