我很想多了解一点docker图像的结构,我知道它在docker build
环境中是如何工作的:构建文件中的每一步都在最后一步的基础上创建新的层,并且X1 M1 N1 X子句和层高速缓存都意味着层在图像之间被重用。
我还知道,使用overlayfs或类似的方法可以有效地合成层,更改会导致编辑/新建/删除的文件在每个层中存储整个文件或中断文件。
我不知道的是这些层是如何绑定在一起的,不知道每一层中是否有一个对其父层的反向引用,也不知道层的顺序是否由单独保存的元数据定义。
我特别好奇的是,是否假设可以从不相关的图像中提取图层,并将它们拼接成一个新的(工作)图像?。也就是说,在不创建副本并将副本存储在Docker存储库中的情况下拼接它们。您可以假设不相关的图像是为此目的而构建的。
- 注意:这不是XY问题。我真诚地想知道这个问题的答案,因为我想知道 *
1条答案
按热度按时间btxsgosb1#
Docker必须知道将它们组合到容器中的顺序。有些东西知道层的顺序。
没错,该信息由image manifest提供,它是一个JSON文件,其中包含一个有序的层列表以及其他信息。
比如我们来看一下官方的
postgres:15
图片,我们可以这样抓取内容进行检查:这让我们:
清单文件包含在
manifest.json
中,如下所示:Docker就是通过这个图层列表知道如何合成最终图像的:你从第一层开始,然后在它上面应用每个后续层。
我不知道每个层中是否有一个对其父层的反向引用,或者层的顺序是否由单独保存的元数据定义。
答案是“两者都有”。顺序由清单中的层列表定义,但每个层也包含对其父层的引用。例如,如果我们查看文件
1cde06c3f46bf13f0d87eeacc400abc4b80283952c96a0f586a3c4dbc53dea8d/json
,我们会看到:属性
parent
是对上一图层的引用。