我们是如何将Docker构建时间缩短40%的

如何提高40%的Docker构建时间 通过利用远程缓存和在ADD和COPY时使用链接,能把原来的docker镜像构建时间提高40%,这是2个非常有效的技巧。 阅读详情

by: WL

Mapmost从设计之初,便选择了云原生道路,在软件开发过程中自然也少不了容器化技术的使用。当然,我们也为Mapmost产品中使用的所有组件构建了 docker 镜像。然而,随着时间的推移,其中一些镜像变得越来越大,CI 构建时间也越来越长。通过调研和总结经验,我们发现:当构建时间超过5分钟时,会降低相关开发人员的工作效率。主要体现在以下两个方面:

  1. 开发人员如果一直等待构建完成,则浪费了大量时间;
  2. 开发人员如果去做新的事情,然后过一段时间再回来,这时候需要额外的上下文切换时间,通常也会导致效率下降。

那么接下来将为大家介绍2个构建小改动,可以大大缩短我们的构建时间。在此之前,我们已参考Docker官方给出的Dockerfile最佳实践编写了Dockerfile,如:

  1. 最小化层数
  2. 使用多阶段构建
  3. 使用最小基础映像

一、BuildKit vs Buildx

让我们首先了解下 Buildkit 和 Buildx,他们通常可以互换使用,但它们并不相同。

1. Buildkit

BuildKit 的诞生旨在取代Docker传统的构建引擎。自 Docker Desktop 以及 Docker Engine 23.0 版本起,BuildKit 成为默认构建器,其优化了构建过程的效率和性能,提供了许多新特性,如:

  • 更优的缓存能力
  • 并行构建
  • 基础镜像的懒拉取(≥ Buildkit 0.9)

如果需要在 23.0 之前的 docker 版本中使用 BuildKit,常见方法如下:

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

2. Buildx

Buildx是Docker的一个插件,支持Buildkit的全部特性。Buildx的产生是因为Buildkit的许多新配置选项,无法向后兼容集成到docker build命令中。

除了提供构建镜像的功能,Buildx还可以管理多个构建器。在CI/CD中,我们使用同一个Docker就能很好的隔离具有不同配置的构建器,而以往我们常常需要在不同的Docker中构建。

如何创建并使用Buildx的基本操作如下:

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

二、 远程存储构建缓存信息

我们介绍的第一个方法:将镜像缓存在远程仓库。

这样,即使在不同机器上进行构建也会用到缓存,典型的使用场景正是在CI/CD中使用不同构建器构建各种镜像。当我们使用默认的构建器时,每个BuildKit实例仅能维护并使用自己的缓存。当在不同的构建器之间切换时,缓存不会共享。因此存在重复拉取镜像。但如果使用外部远程缓存特性,我们则可以指定用于推送和拉取镜像的远程位置,构建时会大大缩短时间。要使用外部缓存,通常指定 --cache-to 和 --cache-from 选项结合buildx。具体形式如下:

docker buildx build --platform linux/amd64 . \
-t someImage:someVersion - push \
--cache-to type=registry,ref=someCachedImage:someVersion,mode=max
--cache-from type=registry,ref=someCachedImage:someVersion

以上指令告诉构建器在someCachedImage:someVersion镜像中查找缓存。当构建完成后,新的构建缓存被推送到相同的镜像中, 覆盖旧缓存。mode=max 表示存储每一层的构建信息,即使是结果镜像中不使用的层(如多阶段构建时中间阶段产生的构建信息)。mode默认值为min,此时只存储结果图像中存在的层的构建信息。

三、添加、复制文件到镜像时使用link选项

自dockerfile1.4语法开始,其对COPY和ADD指令增加了新的选项:--link

# syntax=docker/dockerfile:1.4
FROM ...
COPY --link foo bar

1.在没有使用--link选项时,将某个文件复制到某个目录,需要先完成所有前面的指令,即此时父层快照必须存在,构建器会将父层复制到新快照中,否则如果目录不存在,COPY指令将执行失败。在构建完导出结果镜像时,通过“differ”组件比较所有快照然后将它们合并,从而创建包含每个快照中添加的文件最终镜像文件。

2.通过设置 --link选项,COPY 指令会将文件复制到一个完全新的快照中,而不是基于父层进行添加。在最后生成结果镜像时,这个新快照也会被转换成一个单独层,该层会被链接到父层中。链接操作通常只是涉及一些元数据的更改,此时,构建器无需访问或移动任何文件。即使某些层存在于远程仓库中,也可以在不需拉取或推送它们的情况下远程完成这一操作。

使用该选项前后对比如下:

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

使用--link选项的主要优势是文件不再依赖于父层。只要文件没有改变,即使父层改变了,自身层也可以被复用。得益于此,构建器能够并行执行多层复制数据,大大缩短构建时间。

在这篇文章中,我们介绍了在Mapmost产品开发中使用到的2个小技巧,这样就实现了整体的Docker构建时间减少40%。


Mapmost秉持着“让人与机器联合创作成为新常态”的理念,综合运用多项前沿技术,以SDK二次开发或零代码的方式为工厂、企业等提供一站式数字李生解决方案,现已广泛应用于各行业数字化项目建设。

点击这里跳转Mapmost官网体验

FunASR模型加载太慢?试试这个Docker镜像优化方案,启动速度提升50% 本文针对FunASR模型加载缓慢问题,提供了一套基于Docker镜像的优化方案,显著提升启动速度50%。通过基础镜像精简、模型预加载与缓存机制、运行时参数调优等策略,实现冷启动时间从15分钟缩短至7分钟,内存占用降低40%。特别适合需要快速部署语音识别服务的开发者。 阅读详情

相关推荐

简化神经元模型6 -- Hindmarsh-Rose Model

简化神经元模型 6 Hindmarsh-Rose Model

weixin_73557167的博客 1427

使用 buildx 构建多种系统架构支持的 Docker 镜像

Linux下使用docker buildx 命令构建多种系统架构支持的 Docker 镜像

WZP_LOVE的专栏 1万+

BODAS说明书的中文版与相关资料总结

花了三天时间配了控制器的接线口,找了软件安装的一套东西。 又花了一周时间零零散散在网上只找到关于控制器少得可怜的资料: 1.力士乐控制器RC6系列介绍 2.力士乐控制器手册不完整版 3.RC6-9程序下载 力士乐配套的只有德语和英语两版,人工翻译专业文件的价格太惊人,决定自己写一版方便大家。有不正之处欢迎指出。 For these controllers, in the event of an...

我的技术日常 6495

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

它是最容易使用的方法,但在使用多阶段构建时更加棘手,并且它不能清晰地区分输出的工件和缓存。模式“max”表示为每个层存储构建信息,甚至包括在生成的镜像中未使用的层(例如在使用多阶段构建时)。以前,当使用COPY或ADD命令时,构建器会创建一个新的快照,将新文件与已存在的文件系统合并。本文介绍了两种小的改变,可以让整个Docker构建时间大幅缩减的方法,希望在实践的过程中对大家有所帮助。主要优势是文件不再依赖于先前的层。最终,镜像(构建命令的结果)将由每个层的tarball组成,其中包含各个快照之间的差异。

tangjieqing的博客 899

多普勒频移测速与FMCW测距

文章目录时域与频域基于多普勒频移估计速度基于传统的FMCW测距什么是FMCWFMCW测距原理参考论文 时域与频域 时域 — 自变量是时间,即横轴是时间,纵轴是信号振幅的变化。表示振幅随时间的变化。 频域 — 自变量是频率,即横轴是频率,纵轴是该频率信号幅度的峰值。表示振幅峰值随频率的变化。 基于多普勒频移估计速度 当发送端静止而接收端相对运动时,有: v=FsFcv=\frac{F^s}{F}cv=FFs​c 其中,F是信号的原始频率;FsF^sFs 是接收信号频率与发送信号频率之差,即多普勒频移;c是

dsaaf21的博客 9189

【AI智能体】Dify集成 Echarts实现数据报表展示实战详解

Dify集成 Echarts 实现智能数据报表集成与展示实战详解

congge 5962

Dockerfile命令详解之 COPY

许多同学不知道Dockerfile应该如何写,不清楚Dockerfile中的指令分别有什么意义,能达到什么样的目的,接下来我将详细的为大家解释每一个指令的含义以及用法。​ 指令不区分大小写 。但是,按照惯例,它们应该是大写的,以便更容易地将它们与参数区分开来。

清风怎不知意的博客 2万+

【Bug已解决】Context window exceeded / Token limit reached — Claude Code 上下文窗口超限解决方案

Claude Code 长会话中报上下文窗口/Token 超限,本质是对话历史、文件内容、工具结果累积超过 200K 上限。文中给出 /clear、/compact、分批读大文件、限制工具输出、配置 autoCompact 等完整方案。

一键难忘的博客 6729

Dockerfile的COPY --link

Dockerfile的COPY --link

duke_ding2的博客 2482

龙虾机器人(OpenClaw)本地部署完全技术指南

在开始部署之前,我们需要明确部署的对象。通常所说的“龙虾机器人”指的是开源项目 OpenClaw(曾用名:Clawdbot、Moltbot)。它由程序员彼得·斯坦伯格开发,是一个开源的、可本地部署的通用型AI代理系统。与ChatGPT等对话式AI不同,OpenClaw被赋予了操作系统的权限:它可以执行终端命令、读写文件、操控浏览器、安装软件,甚至通过MCP协议调用外部工具。

huanghm88的专栏 2万+

全网最全-QCC51xx-QCC30xx(TWS)系列从入门到精通开发教程汇总(持续更新中)

QCC3040开发笔记之基本介绍(0) QCC3040开发笔记之开发环境搭建(1) QCC3040开发笔记之debug调试(trb调试,usbt调试,adb调试,WIFI调试)(2) QCC3040开发笔记之按键配置(3) QCC3040开发笔记之按键切换(4) QCC3040开发笔记之按键逻辑(5) QCC3040开发笔记之tone(6) QCC3040开发笔记之提示音(7) QCC3040开发笔记之bitserial接口(8) QCC3040开发笔记之双mic+AEC+ANC(9...

心跳包的博客 3万+

构建时间减少80%,多阶段Docker缓存优化的黄金法则揭秘

掌握Docker镜像的多阶段构建缓存优化,显著提升CI/CD效率。通过分层缓存、依赖前置与阶段复用,减少重复构建,适用于微服务与持续集成场景,构建时间最高降低80%。方法实用高效,值得收藏。

AlgoInk的博客 989

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

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

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

Z__7Gk的博客 1147

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

AlphaFold 3 Docker镜像优化:减小体积与启动时间

科研环境部署中,AlphaFold 3的Docker镜像常因体积过大导致存储成本高、传输慢,启动时间长影响使用体验。以下从基础镜像选择、依赖优化、构建流程改进三方面提供解决方案,实测可减少60%镜像体积,启动时间缩短40%。 ## 基础镜像优化 当前Dockerfile使用[nvidia/cuda:12.6.0-base-ubuntu22.04](https://link.gitcode.co

gitblog_00483的博客 905

10秒构建提速!npm缓存卷在Docker镜像中的实战指南

你是否还在忍受Docker构建时重复下载npm包的漫长等待?本文将通过3个真实案例,教你如何用Docker卷技术将前端镜像构建时间从5分钟压缩到10秒内,同时保持镜像体积减少40%。读完本文你将掌握: - npm缓存卷的3种配置模式及适用场景 - 镜像体积优化的5个关键指标 - 多阶段构建与缓存卷的协同策略 - 常见缓存失效问题的排查方法 ## 缓存痛点:从5分钟到10秒的蜕变 传统Dock...

gitblog_00605的博客 1134

AI如何优化Docker与GitLab的CI/CD流程

然而,随着项目规模的扩大和技术的复杂化,传统的CI/CD流程往往会遇到效率瓶颈和人为错误的问题。AI工具可以扫描Dockerfile内容,检测常见的安全漏洞(如使用root用户、包含敏感信息等)和性能问题(如未合理利用构建缓存、镜像层过多等)。通过分析.gitlab-ci.yml文件,AI可以识别流水线中的串行任务,建议可能并行化的步骤。通过机器学习模型分析历史数据,AI可以预测构建时间、识别潜在问题,并提供实时优化建议。AI模型可以学习历史构建数据,预测新构建的耗时,并在检测到异常延迟时提前预警。

IndigoNight21的博客 704

终极Audiobookshelf Docker镜像优化指南:大幅减小体积与启动时间

Audiobookshelf是一款优秀的**自托管有声书和播客服务器**,让您能够轻松管理个人音频库。通过Docker部署Audiobookshelf是最简单快捷的方式,但标准镜像可能存在体积过大、启动较慢的问题。本文将为您详细介绍如何优化Audiobookshelf Docker镜像,实现更小的体积和更快的启动时间。🚀 ## 📦 当前Docker镜像结构分析 查看项目的[Dockerfi

gitblog_00455的博客 1006

老 Mac 免费装最新 macOS:OpenCore Legacy Patcher 四步实操指南

OpenCore Legacy Patcher 是一个免费开源工具,能让 2007 年以后的 Intel Mac 安装 macOS Big Sur 到 Sequoia,并补齐显卡加速、Wi-Fi、蓝牙等驱动。PowerPC 与 Apple Silicon 机型一律不支持,这类机器直接放弃。 ⚠️ 动手前先把重要数据备份好:U 盘会被整盘格式化,目标磁盘会被抹掉,两者都不可恢复。 ## 老 Ma

gitblog_00974的博客 876

企业级前端Docker镜像构建优化实战指南

Docker镜像构建是现代前端工程化的重要环节,其核心原理是通过分层缓存和依赖管理实现快速可靠的部署。在微前端和monorepo架构下,合理的镜像设计能显著提升CI/CD效率,其中多阶段构建和智能缓存策略是关键。本文基于大型项目实战经验,详细解析如何通过Alpine基础镜像优化、依赖分层安装、安全加固等方案,将构建时间缩短40%以上,同时实现零安全漏洞。特别针对国内开发环境提供了npm加速配置,并分享了企业级监控集成方案,适用于需要高稳定性的React/Vue等前端项目部署场景。

weixin_29574585的博客 190

imgproxy Docker镜像终极优化指南:3个技巧大幅减小体积与启动时间

imgproxy 是一款快速安全的独立服务器,用于调整和转换远程图片。通过优化其 Docker 镜像,不仅能节省存储空间,还能显著提升部署效率和运行性能。本文将分享三个实用技巧,帮助你打造轻量级、高性能的 imgproxy Docker 镜像。 ## 为什么需要优化imgproxy Docker镜像? imgproxy 作为图片处理服务器,其 Docker 镜像的大小和启动速度直接影响部署效率

gitblog_01009的博客 318

突破CI/CD速度瓶颈:Kaniko与Jenkins X无缝集成实战指南

在云原生环境中,容器镜像构建往往成为CI/CD流水线的性能短板。传统Docker-in-Docker方案因安全隐患和资源占用问题,在Kubernetes集群中部署困难;而普通构建工具又难以充分利用集群资源。本文将详细介绍如何通过Kaniko与Jenkins X的深度集成,构建安全高效的容器镜像构建流程,使构建时间减少40%,同时消除root权限依赖。 ## 核心痛点与解决方案架构 ### 传统...

gitblog_00264的博客 632

FireRedASR-AED-L工程化:FireRedASR-AED-L Docker镜像多阶段构建优化

本文介绍了如何在星图GPU平台上自动化部署FireRedASR-AED-L Docker镜像,实现高效的本地语音识别应用。通过多阶段构建优化,该镜像体积减少65%,部署后可用于实时语音转文字、会议记录转录等场景,显著提升处理效率。

weixin_35826166的博客 233

终极指南:使用 untracked 优化 Docker/Heroku/Vercel 部署包大小

你是否曾为臃肿的部署包而烦恼?🤔 在 Docker、Heroku 或 Vercel 部署时,大量不必要的文件(如文档、测试文件、配置文件)被包含在构建中,导致部署包体积庞大、构建时间延长。今天,我将为你介绍一个强大的工具——**untracked**,它能智能识别并忽略这些无用文件,让你的部署包达到最小化!🚀 **untracked** 是一个通用工具,专门用于忽略项目中不必要的常见文件,从

gitblog_00949的博客 517

RocketMQ Dashboard的幕后:如何为Mac M1优化Docker镜像

本文详细介绍了如何为Mac M1设备优化RocketMQ Dashboard的Docker镜像,解决ARM架构兼容性问题。从基础镜像选择、多阶段构建到JVM参数调优,提供了一套完整的性能优化方案,显著提升运行效率和资源利用率。

weixin_29209801的博客 524

Dify在Windows Server 2022的Docker环境下的性能优化实战:资源分配与镜像加速技巧

本文详细介绍了在Windows Server 2022的Docker环境中优化Dify性能的实战技巧,包括硬件资源规划、Docker环境配置、容器资源管理以及镜像加速策略。通过合理的CPU和内存分配、多源镜像加速及存储网络优化,显著提升Dify应用的部署效率和运行性能,适合技术团队参考实施。

weixin_29210727的博客 115
上一篇: 计算机图形系统发展的前世今生
下一篇: 在三维可视化项目中,B/S和C/S架构该如何选择?
Mapmost
博客等级 码龄3年 1724粉丝 191原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值