Docker | 缓存依赖

Poetry依赖一变就重装?巧用Docker层缓存与Buildkit缓存挂载,构建速度飞起 本文详细介绍了如何通过精准控制Docker层缓存和Buildkit缓存挂载技术,优化Poetry依赖安装流程,显著提升Docker构建速度。从依赖与代码分离、缓存清理到多阶段构建和Buildkit缓存持久化,提供了一套完整的Python项目部署最佳实践,帮助开发者将构建时间从几分钟缩短至秒级。 阅读详情

Docker | 缓存依赖

1. 简介

项目使用docker compose,前端与后台都是使用二段构建,先安装依赖编译出文件,在将编译出来的文件,复制到新建构的镜像。然而每次构建镜像都要花大量时间去等待安装前端node.js依赖后台golang的依赖,后面找到解决方法缓存依赖,这样就省去了每次构建镜像时安装依赖的时间。
下面以golang安装依赖为例,/go/pkg/mod为golang依赖的缓存目录。

2. 演示

2.1. 文件树

hello-go
├── Dockerfile
├── go.mod
└── main.go

2.2. 文件内容

Dockerfile

FROM golang:1.19.1-bullseye

WORKDIR hello-go/

COPY . .

# 无缓存依赖
#RUN go env -w GOPROXY=https://goproxy.cn,direct && \
#    go mod tidy && \
#    go build -o main

# 缓存依赖
RUN --mount=type=cache,mode=0777,id=go-mod,target=/go/pkg/mod \
    go env -w GOPROXY=https://goproxy.cn,direct && \
    go mod tidy && \
    go build -o main

CMD ./main

main.go

package main

import (
	"go.uber.org/zap"
)

func main() {
	logger, _ := zap.NewProduction()
	defer logger.Sync()
	logger.Info("Hello world")
}

go.mod

module hello-go

go 1.19

require go.uber.org/zap v1.24.0

require (
	go.uber.org/atomic v1.7.0 // indirect
	go.uber.org/multierr v1.6.0 // indirect
)

2.3. 执行对比

无缓存依赖

docker build -f Dockerfile --no-cache -t hello-go:1.0.0 .

[+] Building 2.3s (9/9) FINISHED                                                                                                                                                                                                        
 => [internal] load build definition from Dockerfile                                                                                                                                                                               0.0s
 => => transferring dockerfile: 37B                                                                                                                                                                                                0.0s
 => [internal] load .dockerignore                                                                                                                                                                                                  0.0s
 => => transferring context: 2B                                                                                                                                                                                                    0.0s
 => [internal] load metadata for docker.io/library/golang:1.19.1-bullseye 
 => [1/4] FROM docker.io/library/golang:1.19.1-bullseye                                                                                                                                                                            0.0s
 => [internal] load build context                                                                                                                                                                                                  0.0s
 => => transferring context: 3.80kB                                                                                                                                                                                                0.0s
 => CACHED [2/4] WORKDIR hello-go/                                                                                                                                                                                                 0.0s
 => [3/4] COPY . .                                                                                                                                                                                                                 0.0s
 => [4/4] RUN go env -w GOPROXY=https://goproxy.cn,direct &&     go mod tidy &&     go build -o main                                                                                                                               2.0s
 => => # go: downloading github.com/stretchr/testify v1.8.0                                                                                                                                                                            
 => => # go: downloading go.uber.org/goleak v1.1.11                                                                                                                                                                                    
 => => # go: downloading github.com/benbjohnson/clock v1.1.0                                                                                                                                                                           
 => => # go: downloading gopkg.in/yaml.v3 v3.0.1                                                                                                                                                                                       
 => => # go: downloading github.com/davecgh/go-spew v1.1.1                                                                                                                                                                             
 => => # go: downloading github.com/pmezard/go-difflib v1.0.0
 ...    

有缓存依赖

有缓存依赖第一次也会下载,后续在执行,不会在重新下载依赖

docker build -f Dockerfile --no-cache -t hello-go:1.0.0 .

[+] Building 1.6s (10/10) FINISHED                                                                                                                                                                                                      
 => [internal] load build definition from Dockerfile                                                                                                                                                                               0.0s
 => => transferring dockerfile: 405B                                                                                                                                                                                               0.0s
 => [internal] load .dockerignore                                                                                                                                                                                                  0.0s
 => => transferring context: 2B                                                                                                                                                                                                    0.0s
 => [internal] load metadata for docker.io/library/golang:1.19.1-bullseye                                                                                                                                                          0.0s
 => [stage-0 1/4] FROM docker.io/library/golang:1.19.1-bullseye                                                                                                                                                                    0.0s
 => [internal] load build context                                                                                                                                                                                                  0.0s
 => => transferring context: 4.17kB                                                                                                                                                                                                0.0s
 => CACHED [internal] settings cache mount permissions                                                                                                                                                                             0.0s
 => CACHED [stage-0 2/4] WORKDIR hello-go/                                                                                                                                                                                         0.0s
 => [stage-0 3/4] COPY . .                                                                                                                                                                                                         0.0s
 => [stage-0 4/4] RUN --mount=type=cache,mode=0777,id=go-mod,target=/go/pkg/mod     go env -w GOPROXY=https://goproxy.cn,direct &&     go mod tidy &&     go build -o main                                                         1.4s
 => exporting to image                                                                                                                                                                                                             0.1s
 => => exporting layers                                                                                                                                                                                                            0.1s
 => => writing image sha256:1d0eefea9bf2a1079782e1233119db73ded083ec399911ddee6720346f1f5502                                                                                                                                       0.0s
 => => naming to docker.io/library/hello-go:1.0.0

3. 注意

  1. 如果hello-go:1.0.0镜像不存在并且执行了docker system prune,依赖缓存会被清理

4. 参考

【Docker 】 本地缓存PyTorch 和 NVIDIA 依赖包 只用【方案一】就足够好了。虽然 6MB/s 下载 2GB 需要点时间(大约 5-10 分钟),但加上后,只要下载成功一次,这辈子都不用再下载了,哪怕你改了 Dockerfile 的其他地方,这一层也会复用本地磁盘上的文件。修改,把那段RUN命令改成带有的版本,然后去掉。 阅读详情

相关推荐

别再对着数据手册画图了!用HFSS 2023 R2快速复现ESP-01的PCB天线(附模型文件)

本文详细介绍了使用HFSS 2023 R2逆向复现ESP-01 PCB天线的五个关键步骤,包括逆向工程准备、高效建模技巧、材料与边界设置、激励与求解配置以及结果分析与设计验证。通过参数化建模和智能边界检测,大幅提升仿真效率,适用于WIFI和蓝牙设备的射频设计优化。

weixin_30832143的博客 76

Docker学习笔记12

Docker学习笔记

CCH2024的专栏 3万+

西门子S7通信协议TSAP配置全攻略:从默认值到自定义修改(附各型号对照表)

本文深入解析西门子S7通信协议中TSAP配置的核心原理与实战方法。针对S7-200/300/400/1200/1500等主流PLC型号,提供了默认TSAP对照表,并详细阐述了如何根据机架号和插槽号计算或自定义Remote TSAP。文章结合常见连接失败案例,给出了系统化的排错流程,旨在帮助工程师快速打通S7通信链路,提升工业自动化现场调试效率。

weixin_29163797的博客 278

docker打镜像耗时处理方案

打包耗时太离谱,解决方法是将需要的依赖包及虚拟环境打成一个发布版本的基础镜像,后续只需要更新代码即可。

吾辈当自强 425

ISP一键下载电路分析+74HC1G66GW(信号图)

之前要不用的最小系统的开发板要不就是用的SWD调试口,没有注意过ISP一键下载电路是个怎么回事,因为需要就简单的看了一下野火的ISP一键下载电路。 默认情况一下,一般我们的程序都是从用户闪存也就是内部的FLASH启动的, 对于F103RCT6来说ROM的大小是512kb,启动地址位0x8000000,这个在IDE keil里可以看的到,如下图。 首先简单理解一下ISP是什么: 可以把他理解为芯片厂商出场时固化在ROM当中的一段程序,它的功能就是把你写的程序一点点的搬运到FLASH当中,它引出了两个引脚

lipengyu1363658871的博客 4861

FPGA高速接口Aurora8B/10B协议实战:从IP核配置到数据流优化

本文详细介绍了FPGA高速接口Aurora8B/10B协议的实战应用,从IP核配置到数据流优化的全流程。通过Aurora8B/10B协议,开发者可以在FPGA间实现高效的数据传输,适用于高速接口设计。文章涵盖了协议基础、IP核配置、AXI4-Stream接口实战技巧以及性能优化策略,帮助读者快速掌握这一关键技术。

weixin_29280657的博客 268

Docker:将文件从 Docker 容器复制到主机

我正在考虑使用 Docker 在持续集成 (CI) 服务器上构建我的依赖项,这样我就不必在代理本身上安装所有运行时和库。为了实现这一点,我需要将容器内构建的构建工件复制回主机。那可能吗?

HuntsBot的博客 1万+

Docker的基本使用

相应的资料 链接:https://pan.baidu.com/s/1rXqV2xWSkx7S8dEKQd63mQ 提取码:1211 1.初识Docker 1.1.什么是Docker 微服务虽然具备各种各样的优势,但服务的拆分通用给部署带来了很大的麻烦。 分布式系统中,依赖的组件非常多,不同组件之间部署时往往会产生一些冲突。 在数百上千台服务中重复部署,环境不一定一致,会遇到各种问题 1.1....

山丘i 1398

【实战指南】基于YOLOv11的肺结节检测系统开发与优化(LUNA2016数据集)

本文提供了基于YOLOv11模型和LUNA2016数据集开发肺结节检测系统的完整实战指南。详细介绍了从环境搭建、数据预处理、模型训练与优化,到构建Web应用系统的全流程,旨在帮助开发者快速掌握医疗影像AI项目的核心开发技能。

weixin_29031057的博客 140

Docker初学

Docker是一个开源的应用容器引擎,让开发者可以打包应用以及依赖到一个可以抑制的容器中,然后发布到流行的Linux机器上,实现虚拟化。容器完全使用沙盒机制,他们不依赖与任何语言,相互之间不会有任何接口。:帮助安装Linux应用,部署应用。1,Docker运行开发中将应用,依赖,函数库,配置一起打包,形成可移植镜像。2,Docker应用运行在容器中,使用沙箱机制,相互隔离Docker镜像中包含运行环境,包括系统的函数库,仅依赖系统的Linux内核,因此可以在任意Linux系统运行。

weixin_56172466的博客 428

YOLO11改进策略【独家融合改进】| RCSOSA + SPD + WFU

SPD-Conv是一种新的 CNN 构建模块,用于替代传统 CNN 架构中使用的步长卷积(strided convolution)和池化(pooling)层,它由空间到深度(Space-to-depth,SPD)层和非步长卷积(non - strided convolution)层组成。WFU模块通过小波变换的频率分解与跨尺度融合机制,解决了传统上采样过程中的混叠和细节丢失问题,实现了高效、高保真的面部细节重建。

Limiiiing的博客 448

Docker build过程中缓存PyTorch依赖加速构建

通过合理设计Docker分层结构,利用官方PyTorch镜像和多阶段构建,将依赖安装与代码变更分离,显著提升构建速度。结合CI/CD中的跨节点缓存共享机制,可将平均构建时间从数分钟缩短至30秒内,大幅提高开发迭代效率与部署稳定性。

weixin_35706255的博客 412

假人有限元模型

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

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Docker build时缓存maven依赖

现阶段所有的项目,都采用docker进行编译打包了,这样可以不用在CI/CD服务器上安装一堆的环境,也能够保证test,staging,production等环境的打包结果保持完全一致。 在用maven给java项目打包过程中,最初是用maven镜像进行编译,然后再把编译产出物复制出来,进行第二步的docker镜像打包,这样比较麻烦,而且有时会有问题,例如第一步编译失败,产生的临时文件owner ...

Turbo.AI,专注AI工程化 5405

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

maven 批量docker_Maven / Docker:缓存所有依赖项

我正在尝试在Docker容器中构建/部署Spring Boot。FROM maven:3.5.3-jdk-8-slim AS buildCOPY ./pom.xml /app/pom.xmlRUN cd /appRUN mvn -f /app/pom.xml -s /usr/share/maven/ref/settings-docker.xml dependency:go-offline depe...

weixin_30574361的博客 809

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

linux: 深入解析 Docker BuildKit, 提升软件第三方依赖缓存的利器

BuildKit 是在 Docker 18.09 版本中引入的构建引擎,旨在替代传统的 Docker 构建引擎。并行构建:BuildKit 能够并行处理多个构建步骤,从而提高构建速度。更好的缓存管理:提供了更精细的缓存控制,可以显著减少重复构建的时间。内联构建秘钥:可以在 Dockerfile 中安全地传递和使用构建时的秘钥。更好的诊断工具:提供了详细的构建日志和调试信息,便于排查构建问题。Docker BuildKit 是提升 Docker 构建效率的强大工具。

十年运维开发经验的王义杰在此分享自己的知识和经验 1432

用 Docker BuildKit 缓存层优化 Python 依赖安装,构建耗时从 3 分钟降到 20 秒Docker

针对 Docker 构建中 pip 安装重复耗时长的问题,利用 BuildKit 的 cache mount 持久化 pip 缓存,使依赖未变时的构建耗时从 3 分钟降至 20 秒,并给出最小可运行 Dockerfile 与实测数据。

hanchenxing的博客 210

docker-stacks镜像多阶段构建缓存键示例:基于依赖文件

在Docker镜像构建过程中,合理利用缓存机制可以显著提升构建效率。本文将以docker-stacks项目为例,详细介绍如何基于依赖文件创建多阶段构建的缓存键,减少重复构建步骤,优化开发流程。 ## 多阶段构建基础 多阶段构建(Multi-stage Build)允许在一个Dockerfile中定义多个构建阶段,每个阶段可以选择性地将文件复制到后续阶段,从而减小最终镜像体积。docker-st...

gitblog_00841的博客 768

【Docker】通过分离依赖层和逻辑层构建顺序,使得开发中的多次构建情境下,依赖层的构建可以走缓存,加快构建速度

Docker 按行读取 Dockerfile,每执行一条指令就会生成一层。Docker 在构建时会检查“当前指令 + 指令依赖的输入(比如 COPY 的文件)”是否与之前构建过的某个层相同。把依赖描述文件(、)先单独复制并 ,这样:然后再把源码复制进来并编译 —— 这样只有编译层因源码变化而重跑。下面是我把你的优化建议整理并修改后的最终 Dockerfile(带行内注释)。把它放在项目根目录下执行构建(或在 CI 中执行)。 小细节说明(针对你的原文中的几处) → 建议改为 ,并按上面分两步:先单独 ,

m0_74282926的博客 1173

java 缓存依赖_如何在Docker中缓存maven依赖项

我正在开发一个约200MB依赖项目,我希望避免因为带宽有限而无法上传 .当我按下我的Dockerfile(我稍后会附上它)时,即使我没有触摸pom.xml,我总是有大约200MB的上传:FROM maven:3.6.0-jdk-8-slimWORKDIR /appADD pom.xml /appRUN mvn verify clean --fail-neverCOPY ./src /app/src...

weixin_35702295的博客 226

如何在 Docker 多阶段构建环境中优雅缓存三方组件依赖

公众号关注「奇妙的 Linux 世界」设为「星标」,每天带你玩转 Linux !非分阶段构建场景下,使用容器进行构建时,我们可以将容器中的缓存目录挂载到构建主机上,执行构建任务;然后将产物拷贝到运行镜像,制作应用镜像。但是在分阶段构建时,构建镜像和运行镜像在同一个 Dockerfile 中,这给优化第三方依赖的缓存带来了难度。1. 创建一个 Vue 实例项目安装 Vue CLInpminsta...

easylife206的专栏 1799

Docker Hub 限流把 CI 拖成全红?用依赖代理做镜像缓存的 8 个步骤

早上 CI 集体报 toomanyrequests,却和代码毫无关系?多半是 Docker Hub 的拉取配额被几十个作业一次性打光。本文从真实报错出发,讲清限流只按 manifest 请求计算的原理,给出 8 个可复现步骤把镜像拉取切到本地缓存,并附上 401/404 排查、四处踩坑与改前改后的实测对比。

GitLab 中国发行版 223

基于依赖引用的仓库缓存清理:从Maven、npm到Docker的安全磁盘瘦身方案

开发机磁盘空间不足是常见痛点,Maven的.m2仓库、npm的_cacache以及Docker镜像层往往占据大量容量。传统清理工具按文件新旧或大小判断,容易误删仍在使用的依赖版本,导致离线构建失败或回滚困难。仓库缓存清理的本质是理解包管理器的依赖引用关系——通过解析pom.xml、lockfile等锁文件,识别哪些缓存被现有项目引用,哪些才是可安全释放的冗余。结合构建缓存、镜像分层和SNAPSHOT策略,才能在不影响后续开发的前提下有效释放磁盘空间。本文从缓存膨胀机制出发,分析通用清理的局限,并介绍一个基于

weixin_42554151的博客 186

Docker Hub 限流 429 还报 Access Denied?依赖代理 9 步把镜像缓存回自己实例

流水线半夜集体报 toomanyrequests,根因是每个作业都在向公共镜像仓库发起清单请求。本文按复现、定位、九步配置、实测对比的顺序,讲清依赖代理如何把镜像缓存回自己的实例,并给出四类高频报错的排查路径。

GitLab 中国发行版 245
上一篇: Debian11 | 安装NVIDIA机器学习环境
下一篇: Go json: unsupported value: NaN
yimtcode
博客等级 码龄6年 205粉丝 140原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yimtcode

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值