Docker:SpringBoot项目分层打包,实现更快构建Docker镜像
大约 2 分钟
前言
从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的分层特征,分次加入文件即可达到分层打包的效果。
这样,修改了业务代码,只有对业务层重新封装打包,项目依赖等其他层不会变化。最终改善了打包速度。