加快 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 时使用,因为打包的操作都是自动触发的,不需要手动一个一个构建,项目多产生一个镜像也不会增加什么负担。

目录
相关文章
|
4天前
|
缓存 Linux 网络安全
docker的镜像无法下载如何解决?
【10月更文挑战第31天】docker的镜像无法下载如何解决?
139 28
|
8天前
|
人工智能 前端开发 Java
基于开源框架Spring AI Alibaba快速构建Java应用
本文旨在帮助开发者快速掌握并应用 Spring AI Alibaba,提升基于 Java 的大模型应用开发效率和安全性。
基于开源框架Spring AI Alibaba快速构建Java应用
|
18天前
|
缓存 监控 持续交付
|
6天前
|
存储 监控 Linux
docker构建镜像详解!!!
本文回顾了Docker的基本命令和管理技巧,包括容器和镜像的增删改查操作,容器的生命周期管理,以及如何通过端口映射和数据卷实现容器与宿主机之间的网络通信和数据持久化。文章还详细介绍了如何使用Docker部署一个简单的Web应用,并通过数据卷映射实现配置文件和日志的管理。最后,文章总结了如何制作自定义镜像,包括Nginx、Python3和CentOS镜像,以及如何制作私有云盘镜像。
63 2
|
8天前
|
关系型数据库 MySQL Docker
docker环境下mysql镜像启动后权限更改问题的解决
在Docker环境下运行MySQL容器时,权限问题是一个常见的困扰。通过正确设置目录和文件的权限,可以确保MySQL容器顺利启动并正常运行。本文提供了多种解决方案,包括在主机上设置正确的权限、使用Dockerfile和Docker Compose进行配置、在容器启动后手动更改权限以及使用 `init`脚本自动更改权限。根据实际情况选择合适的方法,可以有效解决MySQL容器启动后的权限问题。希望本文对您在Docker环境下运行MySQL容器有所帮助。
17 1
|
15天前
|
Kubernetes 负载均衡 Docker
构建高效微服务架构:Docker与Kubernetes的完美搭档
本文介绍了Docker和Kubernetes在构建高效微服务架构中的应用,涵盖基本概念、在微服务架构中的作用及其实现方法。通过具体实例,如用户服务、商品服务和订单服务,展示了如何利用Docker和Kubernetes实现服务的打包、部署、扩展及管理,确保微服务架构的稳定性和可靠性。
61 7
|
9天前
|
Java 数据库连接 数据库
如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面
本文介绍了如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面。通过合理配置初始连接数、最大连接数和空闲连接超时时间,确保系统性能和稳定性。文章还探讨了同步阻塞、异步回调和信号量等并发控制策略,并提供了异常处理的最佳实践。最后,给出了一个简单的连接池示例代码,并推荐使用成熟的连接池框架(如HikariCP、C3P0)以简化开发。
24 2
|
14天前
|
Kubernetes 负载均衡 Docker
构建高效微服务架构:Docker与Kubernetes的完美搭档
【10月更文挑战第22天】随着云计算和容器技术的快速发展,微服务架构逐渐成为现代企业级应用的首选架构。微服务架构将一个大型应用程序拆分为多个小型、独立的服务,每个服务负责完成一个特定的功能。这种架构具有灵活性、可扩展性和易于维护的特点。在构建微服务架构时,Docker和Kubernetes是两个不可或缺的工具,它们可以完美搭档,为微服务架构提供高效的支持。本文将从三个方面探讨Docker和Kubernetes在构建高效微服务架构中的应用:一是Docker和Kubernetes的基本概念;二是它们在微服务架构中的作用;三是通过实例讲解如何使用Docker和Kubernetes构建微服务架构。
51 6
|
9天前
|
存储 Java 开发者
成功优化!Java 基础 Docker 镜像从 674MB 缩减到 58MB 的经验分享
本文分享了如何通过 jlink 和 jdeps 工具将 Java 基础 Docker 镜像从 674MB 优化至 58MB 的经验。首先介绍了选择合适的基础镜像的重要性,然后详细讲解了使用 jlink 构建自定义 JRE 镜像的方法,并通过 jdeps 自动化模块依赖分析,最终实现了镜像的大幅缩减。此外,文章还提供了实用的 .dockerignore 文件技巧和选择安全、兼容的基础镜像的建议,帮助开发者提升镜像优化的效果。
|
13天前
|
负载均衡 应用服务中间件 nginx
基于Nginx和Consul构建自动发现的Docker服务架构——非常之详细
通过使用Nginx和Consul构建自动发现的Docker服务架构,可以显著提高服务的可用性、扩展性和管理效率。Consul实现了服务的自动注册与发现,而Nginx则通过动态配置实现了高效的反向代理与负载均衡。这种架构非常适合需要高可用性和弹性扩展的分布式系统。
20 4
下一篇
无影云桌面