在 OCI 容器镜像规范中,最重要的概念是层(layer)。如果需要对容器镜像的存储尺寸进行优化,就离不开对层的理解。
变化集
层表示的是文件系统的变化集(Changeset)。每个层表示的是对文件系统的改动。容器镜像中的层按照自底向上的顺序排列。从最底层的层开始,依次应用每个层所描述的改动,最后得到容器运行时的文件系统。
对文件系统的改动分成三类,分别是添加、修改和删除。
对于层中的某个路径,如果当前文件系统中不存在,则视为“添加”。
对于层中的某个路径,如果当前文件系统中已经存在,则视为“修改”。
“删除”当前文件系统中的路径需要一种特殊的表示形式。
在这三种改动中,添加和修改很好理解,只需要在改动集中直接添加文件即可。删除则需要使用特殊的 whiteout 文件来表示。
whiteout 是一个空文件,它的作用是表示需要删除的路径。对于需要删除的路径,在该路径的基础名称(basename)上添加 .wh. 前缀就得到了对应的 whiteout 文件的路径。
举例来说,如果要删除的文件路径是 /etc/app/app.conf,那么对应的 whiteout 文件路径是 /etc/app/.wh.app.conf。
这种 whiteout 文件的格式只能删除单个路径。如果要删除某个目录下的全部内容,可以使用 不透明 whiteout 文件。不透明 whiteout 文件的名称是 .wh..wh..opq。当该文件出现在某个目录下时,该目录下的全部内容都会被删除。
举例来说,如果要删除 /etc/app 目录下的全部内容,可以添加路径为 /etc/app/.wh..wh..opq 文件。
下面通过具体的容器镜像示例来介绍层。需要用到工具 skopeo 和 dive。
构建容器镜像

本文深入解析了OCI容器镜像规范中的层(layer)概念,介绍了层作为文件系统变化集的原理,包括添加、修改和删除操作。特别是详细阐述了whiteout文件的作用,用于表示删除操作,分为普通whiteout和不透明whiteout两种类型。通过具体Dockerfile构建的示例,展示了如何查看和分析镜像层的内容,帮助优化容器镜像的存储尺寸。
最低0.47元/天 解锁文章
564

被折叠的 条评论
为什么被折叠?



