【Docker】Docker构造镜像分层打包

简介: 现在越来越多的项目都向云原生靠拢,正好组里慢慢的从docker部署的方案慢慢迁移到rancher部署,在一次技术分享里说到了Java项目打包大小的问题。SpringBoot项目打包会包含我们自己的代码以及依赖的一些第三方jar包,一套技能打下来怎么也得100来M。SpringBoot官方在2.3.0以后支持了分层打包,今天浅试一波。

前言


现在越来越多的项目都向容器化考虑,云原生k8s注定成为未来的潮流。正好我们组里慢慢的从原生docker部署的方案慢慢迁移到Rancher部署,在一次技术分享里说到了Java项目打包大小的问题。


SpringBoot项目打包会包含我们自己的代码以及依赖的一些第三方jar包,一套技能打下来怎么也得100来M。SpringBoot官方在2.3.0以后支持了分层打包,今天浅试一波。


构建镜像

先随便创建个Springboot项目,如何编译成jar包以及Docker使用方式就不多BB了,可自行百度。做一个简单的Dockerfile测试。


pom配置默认打包插件

<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>

写一个非常简单的dockerfile

FROM openjdk:8
RUN mvn clean package -DskipTests
# 声明端口并没有真正运行在这个端口EXPOSE8080ADD ./target/*.jar ./app.jar
CMD java -jar app.jar

springboot项目就引入了一个spring-web包,然后写一个controller实现hello world测试即可。直接运行

docker build . -t docker-demo:0.2

image.png

我们直接使用docker inspect命令查看镜像构造,并查看分层结构

image.png

稍加改动一下项目重新走一遍打包,查看一下新镜像与之前做对比。

image.png

可以发现只有红框里一处编译与上一次不一样,也就是说我们只改动了几个字符,docker打包的时候依然从头加载了一遍springboot的全量jar包,如果仅仅是改动一点代码比如修复线上问题,这些工作显然是可以避免的。这也是导致打包速度慢的重要原因。

image.png


改造服务

首先要在默认的maven打包插件加入分层打包配置

<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 clean package,现在我们可以用下面命令来看分层打包编译的jar包结构

java-Djarmode=layertools-jartarget/dockers-demo-0.0.1-SNAPSHOT.jarlist

image.png

可以看到layertools识别出jar包内将依赖打包到不同文件夹中,接下来我们改造下原有的dockerfile。


改造dockerfile


先说下我们的适用场景,我们给前线部署之后可能会遇到一些bug修复,只会改一下部分代码,如果我们不分层打包的话,一次全量包会特别大效率非常低。


毕竟生产环境没有太大的bug改动,一般修复问题只需要几行代码,如果打全量包的话非常麻烦。


FROM openjdk:8 as builder
RUN mvn clean package -DskipTests
# 声明端口并没有真正运行在这个端口EXPOSE8080ADD ./target/*.jar ./app.jar
RUN java -Djarmode=layertools -jar app.jar extract
FROM openjdk:8-jre
MAINTAINER ttzommed@foxmail.com
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/ ./
EXPOSE8080ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"]

修改成这样就可以实现封层打包了~


总结

springboot官方设定2.3.0版本以上支持分层打包,并且dockerfile文件也改成相应的格式后,确实能达到我们预期的效果。


默认的分层为用户的代码,第三方依赖、SpringBoot内部配置、快照依赖 ,这些SpringBoot都为我们打包到不同的文件夹下。

依靠docker的分层特征,分次加入文件即可达到分层打包的效果。

相关文章
|
1月前
|
存储 JSON 数据格式
docker load 后镜像名称为空的问题解决
Docker在容器化应用程序时提供了强大的镜像管理功能,但也可能在某些操作中遇到如镜像名称为空的问题。通过理解问题的成因并采取适当的解决方案,如正确保存和加载镜像、手动修复标签等,可以有效避免和解决这一问题。通过本文提供的指导,您可以确保在使用Docker进行镜像操作时更为顺利,并提高容器管理的效率。
178 82
|
1天前
|
Docker 容器 Perl
云效flow构建docker镜像更换apt源为阿里镜像源
在 Dockerfile 中添加命令以更换 Debian 源为阿里云镜像,加速容器内软件包下载。核心命令通过 `sed` 实现源地址替换,并更新 apt 软件源。其中 `cat` 命令用于验证替换是否成功,实际使用中可删除该行。
60 31
|
2天前
|
Ubuntu Linux 网络安全
Ubuntu Docker镜像:支持systemctl、SSH、VNC
总的来说,创建一个支持systemctl、SSH和VNC的Ubuntu Docker镜像需要一些技术知识,但是通过学习和实践,我们可以掌握这些技术。这将使我们能够更有效地使用Docker,更好地管理我们的应用程序和服务。CentOS系统中的日志文件位置和管理
35 17
|
6天前
|
Ubuntu 安全 网络安全
Docker镜像:Ubuntu支持systemctl、SSH和VNC
总的来说,Docker提供了一个灵活且强大的方式来创建和运行自定义的Ubuntu镜像。通过理解和使用Dockerfile,你可以轻松地创建一个支持systemctl、SSH和VNC的Ubuntu镜像。
85 21
|
19天前
|
NoSQL Redis 数据库
Docker平台上的Redis镜像运行
这就是如何在Docker平台上运行Redis镜像的全部过程。走进Docker和Redis的世界,探索更多可能!
69 10
|
24天前
|
安全 API 算法框架/工具
大模型文件Docker镜像化部署技术详解
大模型文件Docker镜像化部署技术详解
177 2
|
1月前
|
SQL Linux 数据库
YashanDB Docker镜像制作
本文介绍了使用Docker部署YashanDB数据库的方法及其优势。相比传统部署方式,Docker简化了环境配置,实现一键部署,确保软件在不同环境中一致运行。文章详细讲解了数据库镜像与容器的概念、Dockerfile的构建流程,以及如何通过Dockerfile定制YashanDB镜像。此外,还演示了镜像的发布过程,包括推送至阿里云容器镜像服务(ACR)。最后,探讨了容器启动时的初始化脚本设置和数据文件复用方法,满足客户对数据库自动化初始化和数据持久化的需求。
|
3天前
|
Ubuntu Linux Docker
Docker容器的实战讲解
这只是Docker的冰山一角,但是我希望这个简单的例子能帮助你理解Docker的基本概念和使用方法。Docker是一个强大的工具,它可以帮助你更有效地开发、部署和运行应用。
51 27
|
27天前
|
Ubuntu 关系型数据库 MySQL
容器技术实践:在Ubuntu上使用Docker安装MySQL的步骤。
通过以上的操作,你已经步入了Docker和MySQL的世界,享受了容器技术给你带来的便利。这个旅程中你可能会遇到各种挑战,但是只要你沿着我们划定的路线行进,你就一定可以达到目的地。这就是Ubuntu、Docker和MySQL的灵魂所在,它们为你开辟了一条通往新探索的道路,带你亲身感受到了技术的力量。欢迎在Ubuntu的广阔大海中探索,用Docker技术引领你的航行,随时准备感受新技术带来的震撼和乐趣。
86 16
|
1月前
|
监控 关系型数据库 MySQL
zabbix7.0.9安装-以宝塔安装形式-非docker容器安装方法-系统采用AlmaLinux9系统-最佳匹配操作系统提供稳定运行环境-安装教程完整版本-优雅草卓伊凡
zabbix7.0.9安装-以宝塔安装形式-非docker容器安装方法-系统采用AlmaLinux9系统-最佳匹配操作系统提供稳定运行环境-安装教程完整版本-优雅草卓伊凡
133 30