docker镜像的生成过程

镜像的生成过程

Docker镜像的构建过程,大量应用了镜像间的父子关系。即下层镜像是作为上层镜像的父镜像出现的,下层镜像是作为上层镜像的输入出现。上层镜像是在下层镜像的基础之上变化而来。

FROM centos:7

FROM指令是Dockerfile中唯一不可缺少的命令,它为最终构建出的镜像设定了一个基础镜像。该语句并不会产生新的镜像层,它是使用指定的镜像作为基础镜像层。docker build命令解析 Dockerfile的FROM指令时,可以立即获悉在哪一个镜像基础上完成下一条指令镜像层构建。

对于FROM centos:7来说,Docker Daemon首先从centos:7镜像的文件系统获取到该镜像的ID,然后再根据镜像ID提取出该镜像的json文件内容,以备下一条指令镜像层构建时使用。

LABEL auth=“Tom”

LABEL指令仅修改上一步中提取出的镜像json文件内容,在json中添加LABEL auth=“Tom”,无需更新镜像文件系统。但也会生成一个新的镜像层,只不过该镜像层中只记录了json文件内容的修改变化,没有文件系统的变化。

如果该指令就是最后一条指令,那么此时形成大的镜像和文件系统其实就是原来FROM后指定镜像的文件系统,只是json文件发生了变化。但由于json文件内容发生了变化,所以产生了新的镜像层。

COPY hello.log /val/log/

COPY指令会将宿主机中的指定文件复制到容器的指定目录,所以会改变该镜像层文件系统大小,并生成新的镜像层文件系统内容。所以json文件中的镜像ID也就发生了变化,产生了新的镜像层。

RUN yum -y install vim

RUN指令本身并不会改变镜像层文件系统大小,但由于其RUN的命令是yum install,而该命令运行的结果就是下载并安装一个工具,所以导致RUN命令最后也改变了镜像层文件系统大小,所以也就生成了新的镜像层文件系统内容。所以json文件中的镜像ID也就发生了变化,产生了新的镜像层。

CMD /bin/bash

对于CMD或ENTRYPOINT指令,其是不会改变镜像层文件系统大小的,因为其不会再docker build过程中执行。所以该条指令没有改变镜像层文件系统大小。

但是对于CMD或者ENTRYPOINT指令,由于是等容器启动之后再执行的命令,所以会将其写入到json文件中,会引起json文件的改变。所以json文件中的镜像ID也就发生了变化,产生了新的镜像层。

docker build cache机制

Docker Daemnon 通过 Dockerfile 构建镜像时,当发现即将新构建出的镜像(层)与本地

已存在的某镜像(层)重复时,默认会复用已存在镜像(层)而不是重新构建新的镜像(层),这种

机制称为 docker build cache 机制。该机制不仅加快了镜像的构建过程,同时也大量节省了

Docker 宿主机的空间。

docker build cache 并不是占用内存的 cache,而是一种对磁盘中相应镜像层的检索、复

用机制。所以,无论是关闭 Docker 引擎,还是重启 Docker 宿主机,只要该镜像(层)存在于

本地,那么就会复用。

docker build cache失效

Dockerfile 文件发生变化

当 Dockerfile 文件中某个指令内容发生变化,那么从发生变化的这个指令层开始的所有

镜像层 cache 全部失效。即从该指令行开始的镜像层将构建出新的镜像层,而不再使用 buildcache,即使后面的指令并未发生变化。因为镜像关系本质上是一种树状关系,只要其上层

节点变了,那么该发生变化节点的所有下层节点也就全部变化了。

FROM centos:7
LABEL auto="Hayaizo"
COPY hello.log /var/log/
RUN yum install -y vim
CMD ["/bin/bash"]
EXPOSE 9000

修改为

FROM centos:7
LABEL auto="Hayaizo"
COPY hello.log /usr/local/
RUN yum install -y vim
CMD ["/bin/bash"]
EXPOSE 9000

COPY这一行发生了改变,那么从COPY这一层开始的镜像cache全部失效。

ADD 或 COPY 指令内容变化

Dockerfile 文件内容没有变化,但 ADD 或 COPY 指令所复制的文件内容发生了变化,同

样会使从该指令镜像层开始的后面所有镜像层的 build cache 失效。

echo "hi Jerry" >> hello.log

又开始重新安装了。

RUN 指令外部依赖变化

与 ADD/COPY 指令相似。Dockerfile 文件内容没有变化,但 RUN 命令的外部依赖发生了

变化,例如本例中要安装的 vim 软件源发生了变更(版本变化、下载地址变化等),那么从发

生变化的这个指令层开始的所有镜像层 cache 全部失效。

指定不使用 build cache

有些时候为了确保在镜像构建过程中使用到新的数据,在镜像构建 docker build 时,通

过–no-cache 选项指定不使用 build cache。

清理 dangling build cache

dangling build cache,即悬虚 build cache,指的是无法使用的 build cache。一般为悬虚镜

像 dangling image 所产生的 build cache。通过 docker system prune 命令可以清除。

也可以使用docker system prune来清理:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/307815.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023年12月青少年机器人技术等级考试(四级)理论综合试卷

2023年12月青少年机器人技术等级考试(四级)理论综合试卷 题目总数:30 总分数:100 单选题 第 1 题 单选题 Arduino UNO/Nano主控板,当数字引脚输出信号为高电平时,对应的电压是 ?&…

Replace()函数实例讲解——vba

Replace函数 描述 返回一个字符串,该字符串中指定的子字符串已被替换成另一子字符串,并且替换发生的次数也是指定的。 语法 Replace(expression, find, replace[, start[, count[, compare]]]) Replace函数语法有如下命名参数: …

nginx+keepalived双主模式双主热备

目录 一、双主模式原理 1. nginxkeepalived主备模式缺点 2. 主备模式和双主模式的区别 二、配置文件 1. nginx01的keepalived.conf 2. nginx02的keepalived.conf 3. 检测nginx存活脚本文件nginx_check.sh 三、测试准备 1. 启动nginx01、nginx02 2. 启动keepalived 3. 查看网卡信…

Linux——firewalld防火墙(一)

一、Linux防火墙基础 Linux 的防火墙体系主要工作在网络层.针对TCP/P数据包实时过滤和限制.属于典型的包过滤防火墙(或称为网络层防火墙)。Linux系统的防火墙体系基于内核编码实现.具有非常稳定的性能和高效率,也因此获得广泛的应用.在CentOS 7系统中几种…

D42D43D44|买卖股票的最佳时机

121.买卖股票的最佳时机 初始思路&#xff1a; 暴力解法&#xff0c;两个for循环。 class Solution {public int maxProfit(int[] prices) {int res Integer.MIN_VALUE;for(int i 0;i<prices.length;i){for(int j i1;j<prices.length;j){res Math.max(res,prices[…

Python画国旗

前言 今天&#xff0c;我们来用turtle库来绘制国旗 一、美国国旗 国旗的形状是长方形;国旗的长宽之比为19:10&#xff0c;美国国旗由红、白、蓝三色组成;画面格局由两部分组成&#xff0c;旗的左上方蓝底上排列着50颗白色的星&#xff0c;6颗一排与5颗一排相间排列&#xff…

Python 与 PySpark数据分析实战指南:解锁数据洞见

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 数据分析是当今信息时代中至关重要的技能之一。…

C++:多态究竟是什么?为何能成为面向对象的重要手段之一?

C&#xff1a;多态究竟是什么&#xff1f;为何能成为面向对象的重要手段之一&#xff1f; 前言一、多态的概念二、多态的定义及实现2.1 多态的构成条件2. 2 虚函数2.3 虚函数的重写2.3.1 虚函数重写的例外1&#xff1a;协变(基类与派生类虚函数返回值类型不同)2.3.2 虚函数重写…

在Linux中使用HTTP客户端库进行网络编程

在Linux环境中进行网络编程时&#xff0c;使用HTTP客户端库可以大大简化开发过程。这些库提供了丰富的功能和工具&#xff0c;使开发者能够轻松地发送和接收HTTP请求。以下是使用HTTP客户端库进行网络编程的一些关键步骤和要点。 选择合适的HTTP客户端库 在Linux上有多个流行…

深度学习 Day26——J5DenseNet+SE-Net实战

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制&#x1f680; 文章来源&#xff1a;K同学的学习圈子 文章目录 前言1 我的环境2 pytorch实现DenseNet算法2.1 前期准备2.1.1 引入库2.1.2 设…

番茄助手Visual Assist X安装VS2022

番茄助手Visual Assist X安装VS2022 电脑配置安装步骤0.写在前面1.确保旧版番茄助手插件完全卸载。2.安装VA_X_Setup2440_0.exe&#xff0c;Win10以上系统需要【右键-属性】兼容Win7运行3.使用Everything&#xff08;或其它工具&#xff09;找到C盘对应的“VA_X64.dll”路径&am…

Xmind - win10安装破解Xmind2023

Xmind - win10安装破解Xmind2023 1、下载 Xmind下载 提取码:we6i 2、安装 Step 1:双击运行 exe文件 Step 2:忽略最新版本 最近更新选择继续升级至Pro选择取消Step 4:直接选择同意授权

机器学习 -- 余弦相似度

场景 我有一个 页面如下&#xff08;随便找的&#xff09;&#xff1a; 我的需求是拿到所有回答的链接&#xff0c; 再或者我在找房子网上&#xff0c;爬到所有的房产信息&#xff0c;我们并不想做过多的处理&#xff0c;我只要告诉程序&#xff0c;请帮我爬一个类似 xxx 相似…

千寻位置北斗高精度定位方案获40多家车企品牌订单

千寻位置北斗高精度定位方案获40多家车企品牌订单&#xff0c;在30多款车型上批量交付 千寻位置北斗高精度定位方案在30多款车型上批量交付&#xff0c;包括长城汽车、上汽、一汽红旗、吉利、广汽埃安、小鹏、理想、高合、智己、零跑等汽车厂商的多个智能汽车车型。 进入高速公…

棱镜七彩入选中国数字安全能力图谱(精选版)“SCA”领域

近日&#xff0c;数世咨询正式发布2023年度中国数字安全能力图谱&#xff08;精选版&#xff09;&#xff0c;棱镜七彩凭借在软件供应链安全领域领先的研发实力与创新能力&#xff0c;入选本次图谱应用场景板块SCA领域。 中国数字安全能力图谱”旨在反映中国数字安全产业市场规…

抖店关了一段时间,重新做还能做起来吗?相关抖店运营问题解答!

我是王路飞。 之前有很多新手脑子一热&#xff0c;跟风开通了抖店&#xff0c;保证金什么的也都交了。 后来发现自己做不起来&#xff0c;而且中间可能又忙着别的项目了&#xff0c;就把店铺给关闭了一段时间&#xff0c; 现在店铺又重开了&#xff0c;所以私信我&#xff0…

vue实现-年、月、日、时、分、秒、星期?

一、文章引导 #mermaid-svg-nP4oT3Y4d6oaxUsg {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-nP4oT3Y4d6oaxUsg .error-icon{fill:#552222;}#mermaid-svg-nP4oT3Y4d6oaxUsg .error-text{fill:#552222;stroke:#55222…

现代软件测试中的自动化测试工具

自动化测试的重要性和优势 引言&#xff1a;随着软件开发的不断发展&#xff0c;自动化测试工具在现代软件测试中扮演着重要角色。提高效率&#xff1a;自动化测试可以加快测试流程&#xff0c;减少人工测试所需的时间和资源。提升准确性&#xff1a;自动化测试工具可以减少人…

恭喜Zhilong LI同学通过Oracle 19c OCP考试

Oracle 19c OCP两门科目考试成绩、证书展示&#xff1a; Oracle 19c OCP 1z0-082考试详情 Oracle 19c OCP 1z0-083考试详情

PHP 常见设计模式及示例

1.单例模式 单例模式顾名思义&#xff0c;就是只有一个实例。作为对象的创建模式&#xff0c; 单例模式确保某一个类只有一个实例&#xff0c;而且自行实例化并向整个系统提供这个实例。 单例模式的要点有三个&#xff1a; 一是某个类只能有一个实例&#xff1b;二是它必须自…