加快 java 项目 Docker 镜像构建速度的野路子

简介: 最近接手了一个 java 项目,无论是测试环境还是正式环境,都是 CI/CD 系统自动构建和部署的,用的 Docker,被 java 项目的构建速度虐到了。无论是 Python、Node.js、Go,从零打包镜像的话,在有 Docker cache 的情况下,连续构建镜像的速度是可以很快的。一般的优化方式是先安装依赖模块,然后再编译打包代码库。这样安装依赖的 image layer 可以被 Docker 缓存,下次再构建就不用安装依赖。Java 项目也可以进行类似的优化,比如在 Dockerfile 当中先执行 mvn dependency:resolve 。可但是... 在 mvn

最近接手了一个 java 项目,无论是测试环境还是正式环境,都是 CI/CD 系统自动构建和部署的,用的 Docker,被 java 项目的构建速度虐到了。

无论是 Python、Node.js、Go,从零打包镜像的话,在有 Docker cache 的情况下,连续构建镜像的速度是可以很快的。一般的优化方式是先安装依赖模块,然后再编译打包代码库。这样安装依赖的 image layer 可以被 Docker 缓存,下次再构建就不用安装依赖。

Java 项目也可以进行类似的优化,比如在 Dockerfile 当中先执行 mvn dependency:resolve 。可但是... 在 mvn 打包的时候,还是莫名奇妙的要下载一些 maven 包下来,这导致镜像的构建速度依然很慢。

不是很理解 maven 包管理的机制,但是和 npm、pip 相比,不得不说太繁琐了。。。这门语言都很繁琐了。。。无奈之下,想了个野路子。

本地使用 maven 打包是很快的,因为需要的QQ号码买号平台已经下载下来了,Docker 构建镜像慢,说到底是因为 CI/CD 系统中没有下载好模块文件。既然 Docker cache 不能帮我们解决这个问题,那我们就用 base image 来解决。

具体方法是在代码库里面新写一个 Dockerfile,就叫它 Dockerfile.light 好了,内容大概是下面这样的:

FROM maven:3.5-jdk-8

WORKDIR /src
COPY ./pom.xml /src
RUN mvn dependency:resolve

COPY ./demo /src/src/main/java/hello/
RUN mvn package -Dmaven.test.skip=true
这个 Dockerfile.light 里,将 pom.xml 放进去,但是项目代码不放进去,把 spring boot 的 Get Started 代码放进去,然后使用 maven 打包。

原 Dockerfile 中,将 base image 修改成 Dockerfile.light 构建出来的镜像。然后去掉 mvn dependency:resolve 的那部分代码,直接使用 maven 打包:

-FROM maven:3.5-jdk-8
+FROM baseImage:latest

-WORKDIR /src
-COPY ./pom.xml /src
-RUN mvn dependency:resolve

+RUN rm -rf ./src/main/java/hello
COPY . /src
RUN mvn package -Dmaven.test.skip=true
RUN cp target/*.jar app.jar

CMD java -jar app.jar
如此一来,这个项目每次将创建两个镜像,baseImage 镜像的版本其实并不太重要,只要在构建的时候能够下载到就行,毕竟项目的 pom.xml 还是比较稳定的,不会变动太大,就算变了使用 baseImage 依然能够帮我们减少打包时下载模块的时间。

实际项目测试,如果不修改 pom.xml ,项目构建的时间至少缩短了 50%。当然,这种方案比较适合使用 CI/CD 时使用,因为打包的操作都是自动触发的,不需要手动一个一个构建,项目多产生一个镜像也不会增加什么负担。

目录
相关文章
|
23天前
|
移动开发 Java Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【4月更文挑战第3天】在移动开发领域,性能优化一直是开发者关注的焦点。随着Kotlin的兴起,其在Android开发中的地位逐渐上升,但关于其与Java在性能方面的对比,尚无明确共识。本文通过深入分析并结合实际测试数据,探讨了Kotlin与Java在Android平台上的性能表现,揭示了在不同场景下两者的差异及其对应用性能的潜在影响,为开发者在选择编程语言时提供参考依据。
|
24天前
|
前端开发 应用服务中间件 nginx
Nginx配置详解Docker部署Nginx使用Nginx部署vue前端项目
Nginx配置详解Docker部署Nginx使用Nginx部署vue前端项目
99 0
|
1天前
|
搜索推荐 前端开发 Java
java医院绩效考核管理系统项目源码
系统需要和his系统进行对接,按照设定周期,从his系统获取医院科室和医生、护士、其他人员工作量,对没有录入信息化系统的工作量,绩效考核系统设有手工录入功能(可以批量导入),对获取的数据系统按照设定的公式进行汇算,且设置审核机制,可以退回修正,系统功能强大,完全模拟医院实际绩效核算过程,且每步核算都可以进行调整和参数设置,能适应医院多种绩效核算方式。
3 0
|
2天前
|
存储 Ubuntu Linux
[Docker] 镜像讲解
[Docker] 镜像讲解
|
2天前
|
前端开发 Java 测试技术
Java从入门到精通:4.1.1参与实际项目,锻炼编程与问题解决能力
Java从入门到精通:4.1.1参与实际项目,锻炼编程与问题解决能力
|
5天前
|
运维 前端开发 Devops
云效产品使用报错问题之流水线打包docker镜像时报网络代理有问题如何解决
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
8天前
|
存储 运维 监控
构建高效稳定的Docker容器监控体系
【4月更文挑战第18天】 在现代微服务架构中,Docker容器已成为部署和运行应用的标准环境。随之而来的挑战是如何有效监控这些容器的性能与健康状况,确保系统的稳定性和可靠性。本文将探讨构建一个高效稳定的Docker容器监控体系的关键技术和方法,包括日志管理、性能指标收集以及异常检测机制,旨在为运维人员提供实用的指导和建议。
13 0
|
8天前
|
消息中间件 存储 安全
从零开始构建Java消息队列系统
【4月更文挑战第18天】构建一个简单的Java消息队列系统,包括`Message`类、遵循FIFO原则的`MessageQueue`(使用`LinkedList`实现)、`Producer`和`Consumer`类。在多线程环境下,`MessageQueue`的操作通过`synchronized`保证线程安全。测试代码中,生产者发送10条消息,消费者处理这些消息。实际应用中,可能需要考虑持久化、分布式队列和消息确认等高级特性,或者使用成熟的MQ系统如Kafka或RabbitMQ。
|
9天前
|
消息中间件 存储 Java
深度探索:使用Apache Kafka构建高效Java消息队列处理系统
【4月更文挑战第17天】本文介绍了在Java环境下使用Apache Kafka进行消息队列处理的方法。Kafka是一个分布式流处理平台,采用发布/订阅模型,支持高效的消息生产和消费。文章详细讲解了Kafka的核心概念,包括主题、生产者和消费者,以及消息的存储和消费流程。此外,还展示了Java代码示例,说明如何创建生产者和消费者。最后,讨论了在高并发场景下的优化策略,如分区、消息压缩和批处理。通过理解和应用这些策略,可以构建高性能的消息系统。
|
16天前
|
监控 数据可视化 安全
智慧工地SaaS可视化平台源码,PC端+APP端,支持二开,项目使用,微服务+Java++vue+mysql
环境实时数据、动态监测报警,实时监控施工环境状态,有针对性地预防施工过程中的环境污染问题,打造文明生态施工,创造绿色的生态环境。
14 0
智慧工地SaaS可视化平台源码,PC端+APP端,支持二开,项目使用,微服务+Java++vue+mysql