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

目录
相关文章
|
2天前
|
存储 安全 持续交付
【Docker 专栏】Docker 镜像的版本控制与管理
【5月更文挑战第9天】本文探讨了Docker镜像版本控制与管理的重要性,包括可重复性、回滚能力、协作开发和持续集成。常用方法有标签、构建参数和版本控制系统。管理策略涉及定期清理、分层管理和镜像仓库。语义化标签、环境变量和配置文件在版本控制中有应用。版本系统与Docker结合能跟踪历史和促进协作。注意点包括优化镜像大小、确保安全性和兼容性。案例分析和未来趋势展示了持续发展的镜像管理技术,为Docker应用的稳定与进步保驾护航。
【Docker 专栏】Docker 镜像的版本控制与管理
|
19小时前
|
JavaScript 前端开发 Java
java项目的打包将vue放到.jar里面部署
java项目的打包将vue放到.jar里面部署
|
2天前
|
运维 安全 Docker
【Docker 专栏】Docker 镜像安全扫描与漏洞修复
【5月更文挑战第9天】Docker技术在软件开发和部署中带来便利,但其镜像安全问题不容忽视。本文探讨了Docker镜像安全扫描与漏洞修复,强调了镜像安全对应用和系统的重要性。文中介绍了静态和动态扫描方法,列举了软件漏洞、配置漏洞和恶意软件等常见安全问题,并提到了Clair和Trivy等扫描工具。修复策略包括更新软件、调整配置和重建镜像。此外,加强安全意识、规范镜像制作流程和定期扫描是管理建议。未来,将持续面对新的安全挑战,需持续研究和完善安全技术。
【Docker 专栏】Docker 镜像安全扫描与漏洞修复
|
3天前
|
前端开发 应用服务中间件 nginx
前后端分离项目Docker部署指南(下)
前后端分离项目Docker部署指南(下)
|
3天前
|
NoSQL 关系型数据库 网络安全
前后端分离项目Docker部署指南(上)
前后端分离项目Docker部署指南(上)
|
3天前
|
运维 安全 Linux
深入理解Docker自定义网络:构建高效的容器网络环境
深入理解Docker自定义网络:构建高效的容器网络环境
|
3天前
|
Java Linux 数据安全/隐私保护
Docker自定义JDK镜像并拉取至阿里云镜像仓库全攻略
Docker自定义JDK镜像并拉取至阿里云镜像仓库全攻略
|
3天前
|
存储 弹性计算 运维
Docker数据集与自定义镜像:构建高效容器的关键要素
Docker数据集与自定义镜像:构建高效容器的关键要素
|
3天前
|
Kubernetes Java 调度
Java容器技术:Docker与Kubernetes
Java容器技术:Docker与Kubernetes
13 0
|
3天前
|
传感器 机器人 Java
使用Java构建机器人应用
使用Java构建机器人应用
6 0