当前位置: 首页 > news >正文

如何将Docker的构建时间减少40%

与许多公司类似,我们为产品中使用的所有组件构建docker映像。随着时间的推移,其中一些映像变得越来越大,我们的CI构建花费的时间也越来越长。我的目标是CI构建不超过5分钟——差不多是喝杯咖啡休息的理想时间。如果构建花费的时间超过这个时间,就会降低开发人员的工作效率。

造成生产力损失的原因是:

1、开发人员需要等待构建完成,从而浪费时间。

2、开发人员开始做一些新的东西,并在晚些时候再回来做。切换必然耗时,这通常也会导致效率低下。

图片

在这篇文章中,我想说明我们应用的2个小变化,两者极大地改善了我们的构建时间。当然,在关注这些改进之前,请确保你已经遵循编写dockerfile的最佳实践,比如尽量减少层数;使用多级构建;使用最小的基础图像等等。

1、Buildkit vs Buildx  

让我们从解释Buildkit和Buildx开始,因为这两个术语经常互换使用,但它们并不相同。

Builkit

Buildkit是经过改进的后端,用来取代旧的Docker构建器。它在2018年打包在Docker中,并成为docker engine 23.0的默认构建器。   

它提供了许多有趣的功能:

  • 改进的缓存功能
  • 并行构建不同的层
  • 延迟拉取基础镜像(≥Buildkit 0.9)

在使用Buildkit时,你很快就会注意到docker构建命令的输出看起来更清晰、更结构化。

在docker版本低于23.0的情况下使用Buildkit的典型方法是设置Buildkit参数。如下所示:

DOCKER_BUILDKIT=1 docker build --platform linux/amd64 . -t someImage:someVersion
DOCKER_BUILDKIT=1 docker push someImage:someVersion

Buildx

Buildx是Docker的一个插件,它使你能够在Docker中使用Buildkit的全部潜力。之所以创建它,是因为Buildkit支持许多新的配置选项,这些选项不能全部以向后兼容的方式集成到docker构建命令中。

除了构建镜像之外,Buildx还支持管理多个构建器。在CI中,这对于定义具有不同配置的作用域环境非常有用,因为它们不会修改共享Docker守护进程。

你可以像下面这样开始使用Buildx:

docker buildx create --bootstrap --name builder
docker buildx use builder

2、受益于远程缓存

加快构建速度的第一种方法是在远程注册表中缓存镜像。这样,即使在不同的机器上执行构建,也可以从构建缓存中获益,这是CI中的典型情况。作为一种解决方法,许多人在构建新映像版本之前提取了映像的最新版本。这样做的好处是,你可以缓存未更改的图层,而代价是最初提取完整的图像。拉取完整的图像可能需要一段时间,但也不能保证图层可以被重用。为了说明这一点,我们使用了以下命令:

图片

使用Buildx,你可以将缓存信息存储在远程位置(例如容器注册表、blob存储等)。构建器检查给定层是否已经存在,如果是这种情况,它将重用它而不是再次创建它。这甚至可以在不拉动本地图层的情况下完成。为了从这个机制中受益,我们将之前的命令修改为:   

图片

模式“max”意味着我们将存储每一层的构建信息,甚至是生成图像中未使用的层(例如,当使用多阶段构建时)。默认模式下使用“min”,它只存储最终映像中存在的层的构建信息。

缓存的一个特殊情况是“内联”存储缓存数据,这意味着它将与图像一起缓存。当使用Buildkit而不使用Buildx时,也支持此选项。它是最容易开始的,但在使用多阶段构建时就比较棘手了,而且它没有在工件输出和缓存之间提供明确的分离。内联存储缓存数据的命令如下:

图片

3、添加文件到Docker镜像的新方法

Docker引入了新的dockerfile编写语法,即:

#syntax= docker /dockerfile:1.4。它支持COPY和ADD命令的额外链接选项。

以前,当你使用COPY或ADD命令时,构建器会创建一个新快照,它将新文件与现有文件系统合并。其结果是,在执行此操作之前,父层都需要存在,否则目标目录可能还不存在。最后,你的映像(构建命令的结果)将由每个层的tarball组成,其中包含各个快照之间的差异。

图片

当使用link选项时,新文件将被放入它们自己的快照中,而不依赖于以前的层。链接的文件存储在它们自己的tarball中,不同的tarball被链接在一起,不依赖于现有的文件系统,如下图所示。

图片

https://www.docker.com/blog/image-rebase-and-improved-remote-cache-support-in-new-buildkit/

图片

主要优点是文件不再依赖于以前的层。只要文件没有改变,即使父层改变了,层也可以被重用。

此外,这还可以提高构建的速度,因为现在可以并行执行多层复制数据。

4、结论

本文描述了我们在优化CI管道后获得的一些新见解。我讨论了2个小的变化,导致我们的整体docker构建时间减少了40%:其一,远程存储构建缓存信息;其二,在添加、复制文件到docker镜像时使用link选项。

相关文章:

如何将Docker的构建时间减少40%

与许多公司类似,我们为产品中使用的所有组件构建docker映像。随着时间的推移,其中一些映像变得越来越大,我们的CI构建花费的时间也越来越长。我的目标是CI构建不超过5分钟——差不多是喝杯咖啡休息的理想时间。如果构建花费的时间超过这个时间…...

二分查找——经典题目合集

文章目录 🦜69. x 的平方根🌼题目🌻算法原理🌷代码实现 🐳35. 搜索插入位置🌼题目🌻算法原理🌷代码实现 🦭852. 山脉数组的峰顶索引🌼题目🌻算法原…...

在Jupyter Lab中使用多个环境,及魔法命令简介

一、Jupyter Lab使用conda虚拟环境 1、给虚拟环境添加 ipykernel 方法一: 创建环境时直接添加ipykernel 方法:conda create -n 【虚拟环境名称】python3.8 ipykernel实例如下: conda create -n tensorflow_cpu python3.8 ipykernel 方法二&#xff…...

知虾数据软件:电商人必备知虾数据软件,轻松掌握市场趋势

在当今数字化时代,数据已经成为了企业决策的重要依据。对于电商行业来说,数据更是至关重要。如果你想在电商领域中脱颖而出,那么你需要一款强大的数据分析工具来帮助你更好地了解市场、分析竞争对手、优化运营策略。而知虾数据软件就是这样一…...

c语言中*p1++和p1++有啥区别

在C语言中,*p1和p1是两个不同的表达式,有以下区别: *p1:这是一个后缀递增运算符的组合。首先,*p1会取出指针p1所指向的值,并且对p1进行递增操作。简而言之,这个表达式会先取出p1指向的值&#x…...

2

【任务 2】私有云服务运维[10 分] 【适用平台】私有云 【题目 1】OpenStack 开放镜像权限[0.5 分] 使 用 OpenStack 私 有 云 平 台 , 在 OpenStack 平台的 admin 项 目 中 使 用 cirros-0.3.4-x86_64-disk.img 镜像文件创建名为 glance-cirros 的镜像,通…...

SELinux零知识学习二十二、SELinux策略语言之类型强制(7)

接前一篇文章:SELinux零知识学习二十一、SELinux策略语言之类型强制(6) 二、SELinux策略语言之类型强制 3. 访问向量规则 AV规则就是按照对客体类别的访问许可指定具体含义的规则,SELinux策略语言目前支持四类AV规则&#xff1a…...

cadence layout lvs时出现error

Error:Schematic export failed or was cancelled.Please consult the transcript in the viewer window. 解决办法同下: cadence layout lvs时出现error-CSDN博客...

python练习题(markdown中的60道题)

1.Demo01 摄氏温度转化为华氏温度 celsius float(input(输入摄氏温度:)) fahrenheit (9/5)*celsius 32 print(%0.1f 摄氏温度转为华氏温度为 %0.1f % (celsius, fahrenheit))结果: 2.Demo02 计算圆柱体的体积 h, r map(float, input().split())# …...

【JavaSE】-4-单层循环结构

回顾 运算符: 算术 --、逻辑 && & || |、比较 、三元 、赋值 int i 1; i; j i; //j2 i3 syso(--j"-----"i) //1 3 选择结构 if(){} if(){}else{} if(){}else if(){}else if(){}else{}//支持byte、short、int //支持char //支持枚举…...

12、人工智能、机器学习、深度学习的关系

很多年前听一个机器学习的公开课,在Q&A环节,一个同学问了老师一个问题“机器学习和深度学习是什么关系”? 老师先没回答,而是反问了在场的同学,结果问了2-3个,没有人可以回答的很到位,我当时也是初学一脸懵,会场准备的小礼品也没有拿到。 后来老师解释“机器学习和…...

webpack external 详解

作用:打包时将依赖独立出来,在运行时(runtime)再从外部获取这些扩展依赖,目的时解决打包文件过大的问题。 使用方法: 附上代码块 config.set(externals, {vue: Vue,vue-router: VueRouter,axios: axios,an…...

代码混淆不再愁:一篇掌握核心技巧

​ 1. 概述 代码混淆是将计算机程序的代码转换成一种功能上等价,但是难以阅读和理解的形式。 对于软件开发者来说,代码混淆可以在一定程度上保护程序免被逆向。 对于逆向工程师来说,学习代码混淆可以帮助我们研究反混淆技术。 2. 常见混淆…...

华为云IoT与OpenHarmony深度协同,加速设备上鸿即上云【云驻共创】

本次专题论坛探讨了华为云IoT与Open Harmony的深度协同、边缘屏蔽硬件差异、实现智慧隧道全方位智能化管理,以及华为云与Open Harmony生态的合作。同时也介绍了华为云物联网卡平台、HTTP2协议以及华为物联网在交通领域的应用。 一.华为云IoT与Open Harm…...

深入浅出 Linux 中的 ARM IOMMU SMMU I

Linux 系统下的 SMMU 介绍 在计算机系统架构中,与传统的用于 CPU 访问内存的管理的 MMU 类似,IOMMU (Input Output Memory Management Unit) 将来自系统 I/O 设备的 DMA 请求传递到系统互连之前,它会先转换请求的地址,并对系统 I…...

关于sqlModel 实现查询表单入参空值和模糊匹配一次性查询

在处理表单提交后,后端 SQL 查询部分空值和部分模糊值时,可以使用 SQLModel 构建动态查询。你可以根据表单数据动态构建 SQL 查询,并且只添加那些非空的、有值的条件。 以下是一个示例,假设你有一个模型 Item: from …...

数据仓库架构之详解Kappa和Lambda

目录 一、前言 二、架构详解 1 Lambda 架构 1.1 Lambda 架构组成 1.2 Lambda 特点 1.3 Lambda 架构的优点 1.4 Lambda 架构的不足 2 Kappa 架构 2.1 Kappa 架构的核心组件 2.2 Kappa 架构优点 2.3 Kappa 架构的注意事项 三、区别对比 四、选择时考虑因素 一、前言 …...

Banana Pi BPI-R3 Mini 开源路由器,也能拍出艺术美感

香蕉派BPI-R3 Mini路由器板开发板采用联发科MT7986A(Filogic 830)四核ARM A53芯片设计,板载2G DDR 内存,8G eMMC和128MB SPI NAND存储,是一款非常高性能的开源路由器开发板,支持Wi-Fi6 2.4G/5G(MT7976C)&am…...

Django高级之-分页器

目录 一、引入 二、分页推导 三、数据总页面获取 四、内置方法之divmod 五、终极大法 六、自定义分页器使用 【1】后端 【2】前端 一、引入 针对上一小节批量插入的数据 我们在前端展示的时候发现一个很严重的问题一页展示了所有的数据,数据量太大&#xf…...

Vue-报错No “exports“ main defined in xx

vue报错:No "exports" main defined in F:\wjh\vue#Practice\EasyQuestionnaire-web-master\EasyQuestionnaire-web-master\node_modules\babel\helper-compilation-targets\package.json 1.在文件中找到该路径的package.json文件, 2.按照提示…...

三分钟掌握iFakeLocation:iOS位置模拟的跨平台解决方案

三分钟掌握iFakeLocation:iOS位置模拟的跨平台解决方案 【免费下载链接】iFakeLocation Simulate locations on iOS devices on Windows, Mac and Ubuntu. 项目地址: https://gitcode.com/gh_mirrors/if/iFakeLocation iFakeLocation是一款功能强大的开源工具…...

抖音视频下载的3个技术密码:从单条到批量的全栈破解指南

抖音视频下载的3个技术密码:从单条到批量的全栈破解指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback sup…...

Worm-GPT:AI安全攻防视角下的恶意提示工程与LLM滥用防御

1. 项目概述:当“大模型”被用于恶意目的最近在安全圈里,一个名为“Worm-GPT”的项目引起了不小的波澜。这个项目并非来自某个官方研究机构,而是托管在代码托管平台上,其核心目标直指一个令人不安的方向:探索和演示如何…...

Windows下Claude Code输入`claude`卡住无响应?问题根源在于代理环境变量

原创文章,遵循 CC 4.0 BY-SA 版权协议引言 最近在 Windows 上折腾 Claude Code 时,遇到了一个非常迷惑的问题: claude --version 能正常输出 2.1.78,说明命令已安装成功、PATH 配置正确但只要输入 claude 或 claude "hello&q…...

蓝桥杯单片机CT107D平台:用PCF8591的DAC做个简易数字电压表(附完整代码)

蓝桥杯单片机CT107D平台:基于PCF8591的闭环数字电压表设计与实现 在蓝桥杯单片机竞赛中,CT107D开发平台因其丰富的外设和稳定的性能成为热门选择。其中,PCF8591这颗集成了ADC和DAC功能的芯片,常被用于模拟信号处理的经典案例。本文…...

构建AI智能体行为分析平台:无服务器架构与协同检测算法实战

1. 项目概述:一个为AI智能体经济而生的行为智能平台最近在捣鼓一个挺有意思的项目,叫Clawstrate。简单来说,它就像是一个为AI智能体世界打造的“行为情报中心”。想象一下,未来可能是一个由无数个自主运行的AI智能体(A…...

低查重AI教材编写捷径:AI写教材工具,3天完成20万字教材!

利用AI工具编写教材:高效与创新的结合 编写教材离不开资料的支持,但传统的资料整合方法早已无法满足现代需求。以前,从教育标准到学术论文,再到教学实例,这些信息通常分散在知网、教研平台等多个地方,要想…...

需要抢答器功能?知识竞赛软件选购指南

🎯 需要抢答器功能?知识竞赛软件选购指南精准抢答 公平竞技 一键掌控📌 引言无论是学校学科竞赛、企业技能比拼,还是社区趣味活动,一场精彩的知识竞赛都离不开紧张刺激的抢答环节。传统的硬件抢答器存在布线繁琐、设…...

基于Simulink的储能变流器(PCS)并网预同步与离/并网无缝切换控制​

目录 手把手教你学Simulink——基于Simulink的储能变流器(PCS)并网预同步与离/并网无缝切换控制​ 摘要​ 一、背景与挑战​...

《QGIS快速入门与应用基础》323:社区打卡分享(CSDN博客/社群)

作者:翰墨之道,毕业于国际知名大学空间信息与计算机专业,获硕士学位,现任国内时空智能领域资深专家、CSDN知名技术博主。多年来深耕地理信息与时空智能核心技术研发,精通 QGIS、GrassGIS、OSG、OsgEarth、UE、Cesium、OpenLayers、Leaflet、MapBox 等主流工具与框架,兼具…...