返回顶部
首页 > 资讯 > 服务器 >在Docker中更快地构建Maven项目
  • 154
分享到

在Docker中更快地构建Maven项目

2024-04-02 19:04:59 154人浏览 薄情痞子
摘要

目录一. 概述二. 常规多阶段构建镜像三. 使用 Buildkit 构建镜像四. 使用依赖分层的方式构建镜像五. 在 Buildkit 构建期间使用卷挂载六. 使用 Maven 守护

一. 概述

本文将通过如下几个方式来构建 Docker 镜像,通过记录每种方式的构建时间,从而得到在 Docker 中构建 Maven 项目最快的方式:

  • 常规多阶段构建镜像
  • 使用 Buildkit 构建镜像
  • 使用依赖分层的方式构建镜像
  • 在 Buildkit 构建期间使用卷挂载
  • 使用 Maven 守护进程构建镜像

在每次运行之间,我们通过添加一个空行来更改源代码;在每个部分之间,我们删除所有构建的镜像,包括作为多阶段构建结果的中间镜像,这样是为了避免重复使用以前构建的镜像,以便得到每种方式更准确的构建时间。下面使用一个简单的 Spring Boot 项目进行测试

二. 常规多阶段构建镜像

这是相关的Dockerfile:


FROM openjdk:11-slim-buster as build                         

COPY .mvn .mvn                                               
COPY mvnw .                                                  
COPY pom.xml .                                               
COPY src src                                                 

RUN ./mvnw -B package                                        

FROM openjdk:11-jre-slim-buster                              

COPY --from=build target/fast-maven-builds-1.0.jar .         

EXPOSE 8080

ENTRYPOINT ["java", "-jar", "fast-maven-builds-1.0.jar"]     

让我们执行构建:


time DOCKER_BUILDKIT=0 docker build -t fast-maven:1.0 .      

暂时忘记环境变量,我将在下一节中解释

以下是五次运行的结果:

* 0.36s user 0.53s system 0% cpu 1:53.06 total
* 0.36s user 0.56s system 0% cpu 1:52.50 total
* 0.35s user 0.55s system 0% cpu 1:56.92 total
* 0.36s user 0.56s system 0% cpu 2:04.55 total
* 0.38s user 0.61s system 0% cpu 2:04.68 total

三. 使用 Buildkit 构建镜像

前面的命令行使用了DOCKER_BUILDKIT环境变量,这是告诉 Docker 使用旧引擎的方式。如果你有一段时间没有更新 Docker,那是你正在使用的引擎。如今,BuildKit已取代它,成为新的默认设置。

BuildKit 带来了多项性能改进:

  • 自动垃圾收集
  • 并发依赖解析
  • 高效的指令缓存
  • 构建缓存导入/导出
  • 等等。

让我们在新引擎上重新执行之前的命令:


time docker build -t fast-maven:1.1 .

这是第一次运行的控制台日志的摘录:

...
 => => transferring context: 4.35kB
 => [build 2/6] COPY .mvn .mvn
 => [build 3/6] COPY mvnw .
 => [build 4/6] COPY pom.xml .
 => [build 5/6] COPY src src
 => [build 6/6] RUN ./mvnw -B package
...

0.68s user 1.04s system 1% cpu 2:06.33 total

相同命令的以下执行具有稍微不同的输出:

...
 => => transferring context: 1.82kB
 => CACHED [build 2/6] COPY .mvn .mvn
 => CACHED [build 3/6] COPY mvnw .
 => CACHED [build 4/6] COPY pom.xml .
 => [build 5/6] COPY src src
 => [build 6/6] RUN ./mvnw -B package
...

请记住,我们在两次运行之间更改了源代码。我们不会更改的文件,即.mvn,mvnw和pom.xml,由 BuildKit 缓存。但是这些资源很小,因此缓存不会显着改善构建时间。

* 0.69s user 1.01s system 1% cpu 2:05.08 total
* 0.65s user 0.95s system 1% cpu 1:58.51 total
* 0.68s user 0.99s system 1% cpu 1:59.31 total
* 0.64s user 0.95s system 1% cpu 1:59.82 total

快速浏览日志发现构建中的最大瓶颈是所有依赖项(包括插件)的下载。每次我们更改源代码时都会发生这种情况,这就是 BuildKit 没有提高性能的原因。

四. 使用依赖分层的方式构建镜像

我们应该将精力集中在依赖关系上。为此,我们可以利用层并将构建分为两个步骤:

  • 第一步,我们下载依赖
  • 在第二个,我们做适当的包装

每一步都会创建一个层,第二个取决于第一个。
通过分层,如果我们在第二层更改源代码,则第一层不受影响,可以重复使用。我们不需要再次下载依赖项。新的Dockerfile看起来像:


FROM openjdk:11-slim-buster as build

COPY .mvn .mvn
COPY mvnw .
COPY pom.xml .

RUN ./mvnw -B dependency:Go-offline                          

COPY src src

RUN ./mvnw -B package                                        

FROM openjdk:11-jre-slim-buster

COPY --from=build target/fast-maven-builds-1.2.jar .

EXPOSE 8080

ENTRYPOINT ["java", "-jar", "fast-maven-builds-1.2.jar"]

注意:go-offline不会下载所有内容。如果您尝试使用该-o选项(用于离线),该命令将不会成功运行。这是一个众所周知的老错误。在所有情况下,它都“足够好”。

让我们运行构建:


time docker build -t fast-maven:1.2 .

第一次运行比常规构建花费更多的时间:


0.84s user 1.21s system 1% cpu 2:35.47 total

但是,后续构建要快得多。更改源代码仅影响第二层,不会触发(大多数)依赖项的下载:

* 0.23s user 0.36s system 5% cpu 9.913 total
* 0.21s user 0.33s system 5% cpu 9.923 total
* 0.22s user 0.38s system 6% cpu 9.990 total
* 0.21s user 0.34s system 5% cpu 9.814 total
* 0.22s user 0.37s system 5% cpu 10.454 total

五. 在 Buildkit 构建期间使用卷挂载

分层构建大大缩短了构建时间,不过还有一个问题,更改单个依赖项会使镜像依赖的层无效,因此我们需要再次下载所有依赖项。

幸运的是,BuildKit在构建期间(而不仅仅是在运行期间)引入了卷挂载。有多种类型的挂载可用,但我们感兴趣的一种是缓存挂载。这是一项实验性功能,因此您需要明确选择加入:

Dockerfile看起来像:


# syntax=docker/dockerfile:experimental                      
FROM openjdk:11-slim-buster as build

COPY .mvn .mvn
COPY mvnw .
COPY pom.xml .
COPY src src

# 使用缓存构建
RUN --mount=type=cache,target=/root/.m2,rw ./mvnw -B package 

FROM openjdk:11-jre-slim-buster

COPY --from=build target/fast-maven-builds-1.3.jar .

EXPOSE 8080

ENTRYPOINT ["java", "-jar", "fast-maven-builds-1.3.jar"]

其中 # syntax=docker/dockerfile:experimental 用来开启实验性功能。
使用如下命令构建镜像:


time docker build -t fast-maven:1.3 .

构建时间高于常规构建,但仍低于分层构建:


0.71s user 1.01s system 1% cpu 1:50.50 total

以下构建与层相当:

* 0.22s user 0.33s system 5% cpu 9.677 total
* 0.30s user 0.36s system 6% cpu 10.603 total
* 0.24s user 0.37s system 5% cpu 10.461 total
* 0.24s user 0.39s system 6% cpu 10.178 total
* 0.24s user 0.35s system 5% cpu 10.283 total

六. 使用 Maven 守护进程构建镜像

使用 Maven 守护进程构建镜像的 Dockerfile 文件内容如下:


FROM openjdk:11-slim-buster as build
# 下载最新版本的 Maven 守护进程
ADD https://GitHub.com/mvndaemon/mvnd/releases/download/0.6.0/mvnd-0.6.0-linux-amd64.zip . 
# 更新包索引
RUN apt-get update \     
# 安装 unzip
 && apt-get install unzip \     
# 创建专用文件夹
 && mkdir /opt/mvnd \       
# 提取我们在前面下载的 mvnd
 && unzip mvnd-0.6.0-linux-amd64.zip \ 
# 将提取的存档内容移动到之前创建的文件夹
 && mv mvnd-0.6.0-linux-amd64/* /opt/mvnd                    

COPY .mvn .mvn
COPY mvnw .
COPY pom.xml .
COPY src src
# 使用 mvnd 代替 Maven 包装器
RUN /opt/mvnd/bin/mvnd -B package                            

FROM openjdk:11-jre-slim-buster

COPY --from=build target/fast-maven-builds-1.4.jar .

EXPOSE 8080

ENTRYPOINT ["java", "-jar", "fast-maven-builds-1.4.jar"]

使用下面的命令构建镜像:


time docker build -t fast-maven:1.4 .

日志输出如下:

* 0.70s user 1.01s system 1% cpu 1:51.96 total
* 0.72s user 0.98s system 1% cpu 1:47.93 total
* 0.66s user 0.93s system 1% cpu 1:46.07 total
* 0.76s user 1.04s system 1% cpu 1:50.35 total
* 0.80s user 1.18s system 1% cpu 2:01.45 total

与常规构建镜像相比没有显着改善。

七. 结论

以下是所有执行时间的汇总:

基线 构建工具 图层 卷挂载 MVND
#1 (S) 113.06 125.08 155.47 110.5 111.96
#2 (S) 112.5 118.51 9.91 9.68 107.93
#3 (S) 116.92 119.31 9.92 10.6 106.07
#4 (S) 124.55 119.82 9.99 10.46 110.35
#5 (S) 124.68 9.81 10.18 121.45
#6 (S) 10.45 10.28
#7 (S) 44.71
平均(秒) 118.34 120.68 9.91 10.24 111.55
偏差 28.55 6.67 0.01 0.10 111.47
基线增益 (S) 0 -2.34 108.43 108.10 6.79
% 获得 0.00% -1.98% 91.63% 91.35% 5.74%

在 Docker 中加快 Maven 构建的性能与常规构建有很大不同,限制因素是依赖项的下载速度,需要使用层来缓存依赖项。
对于 BuildKit,建议使用新的缓存挂载功能,以避免在层失效时下载所有依赖项。

参考文章

Https://blog.frankel.ch/faster-maven-builds/2/

到此这篇关于在Docker中更快地构建Maven项目的文章就介绍到这了,更多相关Docker构建Maven项目内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 在Docker中更快地构建Maven项目

本文链接: https://lsjlt.com/news/155544.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 在Docker中更快地构建Maven项目
    目录一. 概述二. 常规多阶段构建镜像三. 使用 Buildkit 构建镜像四. 使用依赖分层的方式构建镜像五. 在 Buildkit 构建期间使用卷挂载六. 使用 Maven 守护...
    99+
    2024-04-02
  • springboot+maven快速构建项目的示例代码
    最近公司运用springboot构建项目,确实比ssh搭建要快很多。首先要下载maven,用maven管理项目很方便,下载完maven配置好环境,maven我就不细说了。创建一个maven项目,pom.xml文件里面写这些:<proj...
    99+
    2023-05-31
    spring boot maven
  • 在 Eclipse 中创建 Maven 项目
    1.在 Eclipse 中配置 Maven Eclipse 中默认自带 Maven 插件,但是自带的 Maven 插件不能修改本地仓库,所 以通常我们不使用自带的 Maven ,而是使用自己安装的,在 Eclipse 中配置 Mave...
    99+
    2023-10-23
    java Powered by 金山文档
  • Maven实现项目构建工具
    目录1.Maven介绍1.1Maven是什么1.2为什么要使用maven2.Maven安装2.1下载Maven:2.2解压并配置2.3编辑Maven环境变量3.Maven配置3.1仓...
    99+
    2024-04-02
  • dubbo maven如何构建根项目
    这篇文章主要讲解了“dubbo maven如何构建根项目”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“dubbo maven如何构建根项目”吧! 准备技能开发语言:JAVA/J2EE项目构建...
    99+
    2023-06-05
  • 在maven项目中引入本地jar包
    文章目录 1、jar包放到项目中 1、jar包放到项目中 在项目个目录下创建libs文件夹,放入jar包 打开File —> Project Structure 点击Libraries,点击“+”,选择Java 选择ja...
    99+
    2023-08-28
    maven jar java intellij-idea
  • Java Maven构建工具中mvnd和Gradle谁更快
    目录1.mvnd 简介2.Gradle 简介2.1 Gradle 优点简述3.Gradle 使用3.1 更换 Gradle 为国内源3.2 项目依赖文件对比3.3 settings....
    99+
    2024-04-02
  • 构建Maven多模块项目的方法
    目录构建Maven多模块项目创建父模块创建子模块:model层创建子模块:dao模块创建子模块:service层创建子模块:web层编译运行项目Maven相关特性父模块的配置父模块聚...
    99+
    2024-04-02
  • Maven环境下构建多模块项目
    目录  1.创建maven_parent项目​编辑  1.1创建maven_dao项目 1.2.创建maven_service模块 1.3.创建maven_controller模块 2.设置模块之间的依赖关系 2.1 dao模块 2.2 s...
    99+
    2023-09-30
    maven java 数据库
  • 2-1. Maven 三层项目结构搭建
    前言 通过上文:1-3. 开发环境安装(全),我们完成了开发环境的安装! 本文开始第二章:二、项目结构搭建 正所谓:万丈高楼平地起,打好地基是关键! 主要内容:创建Maven项目、三层架构说...
    99+
    2023-09-01
    spring boot java maven 项目结构
  • Maven中怎么指定项目构建的源代码目录
    在Maven中,可以通过在pom.xml文件中配置maven-compiler-plugin插件来指定项目构建的源代码目录。 <...
    99+
    2024-04-09
    Maven
  • IDEA快速创建maven项目详细步骤
    目录 前言必读: 1.Maven和Maven Archetype区别? 2.创建maven项目之前的步骤(必看) 一、创建maven 1.打开idea--->文件--->新建--->项目 2.新建项目--->自定义项目名称--->选择Mav...
    99+
    2023-10-18
    intellij-idea maven java 配置maven 依赖管理
  • Eclipse中怎么配置和使用Maven构建项目
    在Eclipse中配置和使用Maven构建项目需要以下步骤: 安装Maven插件: 打开Eclipse,依次点击Help -&...
    99+
    2024-04-03
    Eclipse Maven
  • 怎么用Maven实现项目构建工具
    本篇内容主要讲解“怎么用Maven实现项目构建工具”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用Maven实现项目构建工具”吧!1.Maven介绍1.1Maven是什么Maven项目对象模...
    99+
    2023-07-02
  • 利用maven怎么构建一个spring mvc项目
    利用maven怎么构建一个spring mvc项目?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1使用eclipse构建maven web项目1新建Maven的web项目打...
    99+
    2023-05-31
    maven springmvc
  • 怎么在IDEA中创建一个SpringBoot的maven项目
    今天就跟大家聊聊有关怎么在IDEA中创建一个SpringBoot的maven项目,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。新建项目选择maven项目及JDK,点击下一步:选择好项...
    99+
    2023-06-14
  • Docker构建Java镜像并部署Java项目
    文章目录 1. 准备工作2. 创建Dockerfile3. 构建镜像4. 查看镜像是否构建成功5. 运行容器6. 访问Java服务7. 总结 本文介绍了如何使用Docker构建一个Ja...
    99+
    2023-09-05
    docker java 容器
  • 如何使用Maven构建Java项目?Maven的使用详细解读
    文章目录 1. 前言 2. Maven 快速入门 2.1 Maven 项目模型 2.2 Maven 仓库 3. Maven的安装配置 3.1 安装 3.2 配置环境变量 ...
    99+
    2023-08-16
    java maven eclipse
  • 详解使用Maven构建多模块项目(图文)
    Maven多模块项目,适用于一些比较大的项目,通过合理的模块拆分,实现代码的复用,便于维护和管理。尤其是一些开源框架,也是采用多模块的方式,提供插件集成,用户可以根据需要配置指定的模块。项目结构如下:     test-hd-parent ...
    99+
    2023-05-31
    maven 多模块 多模
  • JavaScript Webpack:性能优化指南,让你构建的项目更快速、更流畅
    使用代码压缩工具 代码压缩工具可以将 JavaScript 代码中的空格、注释和换行符等不必要的内容删除,从而减小代码文件的大小。这可以缩短代码的加载时间,并提高网站或应用程序的性能。一些流行的代码压缩工具包括 UglifyJS、T...
    99+
    2024-02-08
    JavaScript Webpack 性能优化 代码压缩 代码分割 缓存 CDN
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作