浅析 Dockerfile 构建缓存:原理与优化方法
Docker镜像的分层结构
- Docker镜像是由一层一层的文件系统组成,UnionFS将这些镜像层堆叠在一起
- 镜像层是只读的,构建完成后就不能更改了,即使在新的镜像层修改或删除了某些文件,也不会影响之前的镜像层内容
- 用Dockerfile构建镜像时,每个指令都会创建一个新的镜像层,镜像层会被缓存和复用
构建缓存的基本规则
构建镜像时,Docker 按照顺序逐步执行 Dockerfile 中的指令。对于每条指令,Docker 检查它是否可以重用构建缓存中的指令。
- 如果引用的父镜像在构建缓存中,下一个指令将会和所有从该基础镜像派生的子镜像做比较,如果和其中一个子镜像的指令相同,那么缓存命中,否则缓存失效
- 在大部分情况下,通过比较Dockerfile中的指令和子镜像已经足够了,但是有些指令需要进一步的检查
- 对于ADD和COPY指令,文件的内容会被检查,并且会计算每一个文件的校验码。在缓存查找期间,如果文件内容或元数据发生更改,那么缓存就会失效
- 除了ADD和COPY指令之外,缓存检查不会查看容器中的文件来判断是否命中缓存。例如,在处理RUN apt-get -y update指令时,不会检查容器中的更新文件来确定是否命中缓存,这种情况下只会检查指定字符串是否相同
一旦缓存失效,所有后续的 Dockerfile 指令都会生成新的镜像层,不再使用缓存。
如何充分利用缓存
- 将多个命令合并成单个RUN指令时,同时也要考虑将变更频率不同的命令分开
- 指令从变更不频繁到变更频繁的顺序来写
a. 一般源代码会经常变化,所以要把安装依赖等不经常变动的步骤写在前面,拷贝源代码等经常变动的步骤写在后面
b.如果是Python项目的话,先拷贝requerements.txt,然后进行pip install requerements.txt,最后再进行COPY代码 - ARG指令的变量值变化会导致缓存失效,所以最好在使用前定义,不要过早使用
参考
https://docs.docker.com/develop/develop-images/guidelines/#leverage-build-cache
相关文章:
浅析 Dockerfile 构建缓存:原理与优化方法
Docker镜像的分层结构 Docker镜像是由一层一层的文件系统组成,UnionFS将这些镜像层堆叠在一起镜像层是只读的,构建完成后就不能更改了,即使在新的镜像层修改或删除了某些文件,也不会影响之前的镜像层内容用Dockerfile构建镜像时&…...
隐藏层节点数对分类准确率的影响
直线上有9个格子,4个石子, 数量 结构编号 6 0 1 1 1 1 0 0 0 0 0 5 2 1 1 1 0 1 0 0 0 0 5 1 1 0 1 1 1 0 0 0 0 4 3 1 1 0 0 1 1 0 0 0 4 4 1 0 1 0 1 1 0 0 0 3 5 1 0 1 0 1 0 1 0…...
【水浸传感器】软硬件一体水浸监测整套方案远程监测解决各种环境漏水问题
一、痛点分析 在工业生产中,水浸传感器可以安装在数据中心、半导体厂房、输油管道、车间仓库、变电室等易发生水浸的区域。一旦检测到漏水情况,立即发出信号反馈。然而,水浸传感器分散在各个地点,导致管理不集中、不便捷…...
知虾会员**成为知虾会员,尊享专属权益**
在当今繁忙的生活中,线上购物已经成为现代人们的主要消费方式之一。而作为线上购物平台的领军者之一,Shopee为了提供更加个性化和便利的购物体验,推出了知虾会员(Shopee会员)服务。知虾会员不仅可以享受到一系列会员专…...
好代码网同款wordpress主题,适合搭建资源分享类网站,自带五六百的精品资源数据
代码简介: 好代码资源网是个还不错的资源分享类网站,基于wordpress搭建的。它的主题看起来还是不错的。这里分享一下这个网站的主题包。说是主题包,其实就是整站打包的,集成了主题(wordpress美化主题包几个插件&#…...
Java多线程<三>常见的多线程设计模式
多线程的设计模式 两阶段线程终止 park方法 interrupted() 会让他失效。 使用volatile关键字进行改写 单例模式 双锁检测 保护性暂停 实现1: package threadBase.model;/*** author: Zekun Fu* date: 2022/5/29 19:01* Description:* 保护性暂停,* …...
JavaScript 基础二part1.运算符:赋值、一元、比较、逻辑运算符
JavaScript 基础二 1.1 赋值运算符1.2 一元运算符自增运算符的用法:例题 1.3 比较运算符不同类型间的比较严格相等对 null 和 undefined 进行比较 1.4 逻辑运算符例题 1.5 运算符优先级 1.1 赋值运算符 赋值运算符:对变量进行赋值的运算符 已经学过的赋…...
Linux 进程(八) 进程的退出码
main 函数的返回值叫做进程的退出码。当进程成功退出的时候,我们一般用0来表示。进程失败的时候一般用非零来表示。我们使用不同的数字来表示进程退出时不同的失败原因。 我们查看系统的有多少退出码以及其含义时需要用到strerror() 他的头文件和用法如下。 通过一…...
Go语言中支持的internal目录配置与组织内私网包配置详解
Go 中的内部包 这里可能会有歧义 可能是 Go 的 internal 目录中的包也可能是指内部开发的包 函数和变量的可见性 对于函数和变量而言,有如下规则:1 )小写字母开头的函数变量结构体只能在本包内访问2 )大写字母开头的函数变量结…...
如何使用Nmap加强网络安全?
Nmap是Network Mapper(网络映射器)的缩写,是一个用于端口和IP扫描以及应用程序检测的开源工具。网络和系统管理员将其用于清点网络资产、管理服务升级计划和监视服务正常运行时间。 起初,它是作为一款Linux工具而开发的ÿ…...
LeetCode 2487. 从链表中移除节点:单调栈
【LetMeFly】2487.从链表中移除节点:单调栈 力扣题目链接:https://leetcode.cn/problems/remove-nodes-from-linked-list/ 给你一个链表的头节点 head 。 移除每个右侧有一个更大数值的节点。 返回修改后链表的头节点 head 。 示例 1: 输…...
LabVIEW在高精度机器人视觉定位系统中的应用
在现代工业自动化中,精确的机器人视觉定位系统对于提高生产效率和产品质量至关重要。LabVIEW软件,以其卓越的图像处理和自动化控制功能,在这一领域发挥着重要作用。本案例将展示LabVIEW如何帮助开发和实现一个高精度的机器人视觉定位系统&…...
Arm CCA机密计算扩展
目录 Realms Realm World和Root World Arm TrustZone扩展和Arm RME之间有什么区别? 在《什么是机密计算?》中所述,Arm CCA允许您在阻止更高特权软件实体(例如Hypervisor)访问的同时部署应用程序或虚拟机(VM)。然而,通常由这些特权软件实体管理内存等资源。在这种情况…...
【Unity入门】热更新框架之xLua
目录 一、xLua概述1.1xLua简介1.2xLua安装 二、Lua文件加载2.1执行字符串2.2加载Lua文件2.3自定义loader 三、xLua文件配置3.1打标签3.2静态列表3.3动态列表 四、Lua与C#交互4.1 C#访问Lua4.1.1 获取一个全局基本数据类型4.1.2 访问一个全局的table4.1.3 访问一个全局的functio…...
大数据Doris(四十五):物化视图选择最优
文章目录 物化视图选择最优 物化视图选择最优 下面详细解释一下第一步最优物化视图是被如何选择出来的。 这里分为两个步骤: 对候选集合进行一个过滤。只要是查询的结果能从物化视图数据计算(取部分行,部分列,或部分行列的聚合)出都可以留在候选集中,过滤完成后候选集合…...
PostgreSQL10数据库源码安装及plpython2u、uuid-ossp插件安装
PostgreSQL10数据库源码安装及plpython2u、uuid-ossp插件安装 1、环境2、安装包下载3、安装3.1 、解压3.2、配置3.3、编译安装3.4 、启动与关闭 4、安装 uuid-ossp 、plpython2u插件5、参考 1、环境 centos 7 、 postgresql 10.19 2、安装包下载 postgres 源码安装包 3、安…...
如何成为ChatGPT 优质Prompt创作者
如何提问? 我想让你成为我的Prompt创作者。你的目标是帮助我创作最佳的Prompt,这个Prompt将由你ChatGPT使用。你将遵循 以下过程:1.首先,你会问我Prompt是关于什么?我会告诉你,但我们需要 通过不断的重复来…...
LeetCode第71题 - 简化路径
题目 以 Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说,将其转换为规范路径。 在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (…) 表…...
VSCode上远程调试代码出现的问题
记录一下: 真的是汗流浃背了,师妹叫帮忙如何在VSCode上远程调试代码,一些自己已经经历过的问题,现在已经忘记了。又在网上一顿搜索,这次记录下吧。。。 出现以下问题: 1. 终端界面总是sh-4.4 $ ÿ…...
【langchain】入门初探实战笔记(Chain, Retrieve, Memory, Agent)
1. 简介 1.1 大语言模型技术栈 大语言模型技术栈由四个主要部分组成: 数据预处理流程(data preprocessing pipeline)嵌入端点(embeddings endpoint )向量存储(vector store)LLM 终端ÿ…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
Python 高效图像帧提取与视频编码:实战指南
Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...
Linux 下 DMA 内存映射浅析
序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存,但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程,可以参考这篇文章,我觉得写的非常…...
OCR MLLM Evaluation
为什么需要评测体系?——背景与矛盾 能干的事: 看清楚发票、身份证上的字(准确率>90%),速度飞快(眨眼间完成)。干不了的事: 碰到复杂表格(合并单元…...
