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来清理:

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

环境变量的使用

1.用法 1.建立文件夹.env.production(开发).env.development(生产) 代码: NODE_ENVdevelopment VUE_APP_BASE_APIwww.aaa.comNODE_ENVproduction VUE_APP_BASE_APIwww.xxx.com 注意: 环境变量的文件夹应该是和src目录同级的: 2.获取 process.env.V…

【现代密码学】笔记3.1-3.3 --规约证明、伪随机性《introduction to modern cryphtography》

【现代密码学】笔记3.1-3.3 --规约证明、伪随机性《introduction to modern cryphtography》 写在最前面私钥加密与伪随机性 第一部分密码学的计算方法论计算安全加密的定义:对称加密算法 伪随机性伪随机生成器(PRG) 规约法规约证明 构造安全…

PPT插件-大珩助手-清除同类

清除同类-颜色 对于选定的形状,删除相同颜色 清除同类-文本 删除当前幻灯片中的文本对象 清除同类-非文本 删除当前幻灯片中的非文本对象 清空当页 删除当前幻灯片中的所有对象 选中的形状动画 删除选中的对象上的形状动画 当前页形状动画 对于当前页中的…

Python画国旗

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

怎样的摆渡系统,能实现安全可管控的跨网数据传输?

大数据时代,数据在流通与传输的过程中,更需要注意到数据的安全防护,护航数据价值。“让数据主宰一切的隐忧”,数字战争的时代,各国早已认识到网络安全愈发重要,数据也成为各国发展的重要武器。 出于安全性和…

spring boot 自动扫描Controller、Service、Component原理

项目里面为什么不加上ComponentScan("com.yym.*")注解,也能加载到子目录里面的Controller,Service,Component的bean呢? 启动类没有ComponentScan注解 SpringBootApplication public class BootStrap {public static v…

快乐学Python,数据分析之获取数据方法「公开数据或爬虫」

学习Python数据分析,第一步是先获取数据,为什么说数据获取是数据分析的第一步呢,显而易见:数据分析,得先有数据,才能分析。 作为个人来说,如何获取用于分析的数据集呢? 1、获取现成…

华为 1+X《网络系统建设与运维(高级)》认证模拟实验上机试题

华为 1X《网络系统建设与运维(高级)》认证模拟实验上机试题 一、考试背景二、考试说明2.1考试分数说明2.2考试要求2.3考试环境介绍2.4启动考试环境2.5保存答案(非常重要) 三、考试正文3.1注意事项3.2校区内(LAN)3.2.1任务 1&#…

【力扣每日一题】力扣2696删除子串后的字符串最小长度

题目来源 力扣2696删除子串后的字符串最小长度 题目概述 给你一个仅由 大写 英文字符组成的字符串 s 。 你可以对此字符串执行一些操作,在每一步操作中,你可以从 s 中删除 任一个 "AB" 或 "CD" 子字符串。 通过执行操作&#xff…

golang 记录一次协程和协程池的使用,利用ants协程池来处理定时器导致服务全部阻塞

前言 在实习的项目中有一个地方遇到了需要协程池的地方,在mt推荐下使用了ants库。因此在此篇记录一下自己学习使用此库的情况。 场景描述 此服务大致是一个kafka消息接收、发送相关。接收消息,根据参数设置定时器进行重发。 通过这里新建kafka服务&a…

淘宝商品数据采集订单数据采集店铺数据采集API演示

淘宝商品数据采集代码 -- 请求示例 url 默认请求参数已经URL编码处理 curl -i "https://api-gw.cn/taobao/item_get/?key<您自己的apiKey>&secret<您自己的apiSecret>&num_iid652874751412&is_promotion1" 商品详情页与获取到的返回数据示…

深入理解 Hadoop (五)YARN核心工作机制浅析

概述 YARN 的核心设计理念是 服务化&#xff08;Service&#xff09; 和 事件驱动&#xff08;Event EventHandler&#xff09;。服务化 和 事件驱动 软件设计思想的引入&#xff0c;使得 YARN 具有低耦合、高内聚的特点&#xff0c;各个模块只需完成各自功能&#xff0c;而模…