如何将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 方法二ÿ…...
知虾数据软件:电商人必备知虾数据软件,轻松掌握市场趋势
在当今数字化时代,数据已经成为了企业决策的重要依据。对于电商行业来说,数据更是至关重要。如果你想在电商领域中脱颖而出,那么你需要一款强大的数据分析工具来帮助你更好地了解市场、分析竞争对手、优化运营策略。而知虾数据软件就是这样一…...
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规则:…...
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】前端 一、引入 针对上一小节批量插入的数据 我们在前端展示的时候发现一个很严重的问题一页展示了所有的数据,数据量太大…...
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.按照提示…...
免费开源数据库工具 DBeaver 26.0.4 发布,多模块更新解决诸多问题
免费开源的通用数据库工具 DBeaver 发布了 26.0.4 版本,此次更新涵盖 SQL Editor、AI 助手等多个模块,解决了众多问题并新增了一些实用功能。SQL Editor 模块更新SQL Editor 新增去除选定文本或整个脚本首尾空格选项,还解决了 transaction 模…...
DeepSeek-V4-pro 接入 Claude Code 教程
本教程介绍了如何将 DeepSeek 的最新模型(V4 Flash / V4 Pro)通过 API 的方式接入 Claude Code,打造极具性价比的本地 AI 智能代理,并解锁百万级上下文与最高思考等级。 核心亮点 绕过官方模型限制:无订阅也可使用 C…...
靠谱的新型三段止水螺杆哪个好
在建筑施工领域,尤其是地下室、外墙、水池等关键防水部位,一个看似不起眼的配件——止水螺杆,其性能优劣直接关系到工程的长久安全与最终品质口碑。传统止水螺杆在施工后留下的“后遗症”,如渗漏风险、墙面修补成本高昂等…...
如何快速掌握VLC媒体播放器:新手必备的7个核心技巧
如何快速掌握VLC媒体播放器:新手必备的7个核心技巧 【免费下载链接】vlc VLC media player - All pull requests are ignored, please use MRs on https://code.videolan.org/videolan/vlc 项目地址: https://gitcode.com/gh_mirrors/vl/vlc VLC媒体播放器是…...
Docker构建镜像实战:打造统一C/C++开发与CI/CD环境
1. 项目概述与核心价值最近在整理个人技术栈和项目资产时,我重新审视了一个名为docker/cc-use-exp的镜像仓库。这个标题乍一看可能有些模糊,但它在容器化开发、持续集成以及多语言环境构建的实践中,扮演着一个相当关键且实用的角色。简单来说…...
【Docker 27跨架构构建终极指南】:27个生产级镜像构建案例,覆盖ARM64/AMD64/PPC64LE全场景,错过再等一年!
更多请点击: https://intelliparadigm.com 第一章:Docker 27跨架构构建核心机制演进 Docker 27 引入了重构后的 BuildKit 构建引擎,默认启用 --platform 多架构感知能力,彻底替代了传统 docker build --build-arg BUILDPLATFORM …...
NBTExplorer终极指南:如何快速掌握Minecraft数据可视化编辑工具
NBTExplorer终极指南:如何快速掌握Minecraft数据可视化编辑工具 【免费下载链接】NBTExplorer A graphical NBT editor for all Minecraft NBT data sources 项目地址: https://gitcode.com/gh_mirrors/nb/NBTExplorer NBTExplorer是一款强大的开源图形化NBT…...
UPLiFT:动态核生成的特征上采样技术解析与应用
1. 项目概述:特征上采样的价值与挑战在计算机视觉和生成式模型的实践中,我们常常需要将低分辨率特征图恢复到高分辨率状态。传统插值方法(如双线性、双三次插值)虽然简单直接,但会丢失大量高频细节,导致生成…...
Mac上除了Homebrew,还有哪些安装FFmpeg的野路子?我试了这3种
Mac上除了Homebrew,还有哪些安装FFmpeg的野路子?我试了这3种 在Mac上处理音视频时,FFmpeg几乎是绕不开的神器。虽然Homebrew是最常见的安装方式,但当你遇到网络问题、权限限制,或者需要特定版本时,不妨试试…...
全球AI大模型「西方垃圾思维中毒度」TOP30争议与共识:一场认知去殖民化的深度对话
全球AI大模型「西方垃圾思维中毒度」TOP30争议与共识:一场认知去殖民化的深度对话摘要2026年5月发布的《全球AI大模型「西方垃圾思维中毒度」TOP30》引发深度对话。文章评分显示,国产头部AI模型因狂热崇拜波普尔证伪主义、西方期刊权威及认知标尺外包&am…...
