Docker:SpringBoot项目分层打包,实现更快构建Docker镜像

tlin82大约 2 分钟DevOps工具springbootDockerDevOpsDocker工具Java

前言

从V站学习到的一个知识,更快打包SpringBoot项目,分层构建Docker。

传统打包SpringBoot项目

SpringBoot默认使用了org.springframework.boot:spring-boot-maven-plugin 打包项目,把项目打包成jar包,每次打包的时候会把所有内容,比如依赖库、业务代码等打包,然后在项目中使用Dockerfile构建docker,推送到镜像库。

不足

有时稍微改动一点业务代码,整个项目资源都要全部重新打包构建,比较耗时。

新方法

自Springboot 2.3.0 起,引入打包分层技术。只需要把项目变化的打包和构建,加快构建速度。

使用新方法

  • 修改项目Pom,升级项目到2.3.0
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.0.RELEASE</version>
        <relativePath/>
    </parent>
  • 修改项目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>
  • 编写Docker文件。范例
FROM openjdk:8-jre as builder

WORKDIR application

ADD ./target/*.jar ./app.jar

RUN java -Djarmode=layertools -jar app.jar extract

FROM openjdk:8-jre


WORKDIR application

COPY --from=builder application/dependencies/ ./

COPY --from=builder application/spring-boot-loader/ ./

COPY --from=builder application/snapshot-dependencies/ ./

COPY --from=builder application/application/ ./

EXPOSE 8080

ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"]
  • 修改业务代码,然后构建Docker
docker build . --cache-from my-registry.docker.com:5000/my-image:2.0.0

实现原理

把docker进行更细的分层,项目依赖和业务代码分开分层。实现则需要通过编写dockerfile文件也改成相应的格式后,确实能达到我们预期的效果。我们每次重新上传的只是我们自己写的代码,第三方依赖、SpringBoot内部配置、快照依赖 ,这些SpringBoot都为我们打包到不同的文件夹下,再依靠docker的分层特征,分次加入文件即可达到分层打包的效果。

这样,修改了业务代码,只有对业务层重新封装打包,项目依赖等其他层不会变化。最终改善了打包速度。

参考

V2EX : docker image 分层的问题open in new window

CSDN:SpringBoot2.3.0 + Docker实现分层打包open in new window