springboot服务docker打包分层的实现

 更新时间:2025年09月16日 10:32:14   作者:在下uptown  
SpringBoot2.3.0支持分层打包,通过Maven分层仅重建业务代码层,可以避免重复打包依赖,大幅提升容器构建效率,具有一定的参考价值,感兴趣的可以了解一下

前言

随着云原生技术的发展,现在大部分企业项目都通过容器化来部署项目,不管是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打包分层内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Docker 中快速安装tensorflow环境的方法步骤

    Docker 中快速安装tensorflow环境的方法步骤

    这篇文章主要介绍了Docker 中快速安装tensorflow环境的方法步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10
  • docker中多阶段构建与单阶段构建的具体使用

    docker中多阶段构建与单阶段构建的具体使用

    本文主要介绍了docker中多阶段构建与单阶段构建的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-09-09
  • docker search 报错但 pull 正常的问题解析

    docker search 报错但 pull 正常的问题解析

    用户在Windows 11 WSL2 Ubuntu 20.04中使用docker search报错,但docker pull正常,建议通过docker pull直接获取镜像,如搜索mysql时指向特定地址,本文给大家介绍docker search 报错但 pull 正常的问题解析,感兴趣的朋友一起看看吧
    2025-07-07
  • Docker目录迁移的实现示例

    Docker目录迁移的实现示例

    Docker默认目录比较小,容器日志过多就会导致无法运行,本文主要介绍了Docker目录迁移的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06
  • docker修改默认存储位置图文教程

    docker修改默认存储位置图文教程

    最近在学习docker的路上,今天遇到了个问题,在网上查找了一下资料,顺便留个笔记,下面这篇文章主要给大家介绍了关于docker修改默认存储位置的相关资料,需要的朋友可以参考下
    2022-09-09
  • docker建立私有仓库的过程

    docker建立私有仓库的过程

    这篇文章主要介绍了docker私有仓库的建立,在这需要注意从私有仓库下载先移出原镜像,具体操作过程跟随小编一起看看吧
    2022-01-01
  • docker安装nacos的详细教程

    docker安装nacos的详细教程

    这篇文章主要介绍了docker安装nacos,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • docker拉取镜像查看版本的方法步骤

    docker拉取镜像查看版本的方法步骤

    这篇文章主要介绍了docker拉取镜像查看版本的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • Docker自定义镜像输出日志的问题小结

    Docker自定义镜像输出日志的问题小结

    本文主要解决Docker自定义镜像之后,通过docker logs命令查看不到相关日志的问题,下面给大家分享几种方法,感兴趣的朋友一起看看吧
    2025-05-05
  • Docker容器操作方法详解

    Docker容器操作方法详解

    Docker 在隔离的容器中运行进程。之前总结了Docker镜像的使用详解,本篇按照之前测试openGauss容器过程中总结出来使用Docker容器的常用命令
    2022-08-08

最新评论