如果基本docker映像发生更改,从属映像是否会自动更改?
假设我有一个Dockerfile,其中我使用FROM指令基于其他图像构建了一个图像 例如,我的图像名为如果基本docker映像发生更改,从属映像是否会自动更改?,docker,Docker,假设我有一个Dockerfile,其中我使用FROM指令基于其他图像构建了一个图像 例如,我的图像名为extendedImage,从baseImage开始,然后安装其他内容 现在,假设baseImage得到更新。我使用docker pull baseImage获取更新。现在,如果我docker运行extendedImage,它会反映在baseImage中所做的更改吗?或者我必须首先再次docker build extendedImage,以使其反映更新后的baseImage?图像是由层构建的,每
extendedImage
,从baseImage开始,然后安装其他内容
现在,假设
baseImage
得到更新。我使用docker pull baseImage
获取更新。现在,如果我docker运行extendedImage
,它会反映在baseImage
中所做的更改吗?或者我必须首先再次docker build extendedImage
,以使其反映更新后的baseImage
?图像是由层构建的,每个层的实际名称是其哈希值,而不是其标记
我有一个我称之为“foo”的图像,它是从“bar”构建的,但我真正拥有的是这个(最新的一层位于顶部):
尝试以下操作:docker run-dfoo
,然后进行一些更改并docker build-tfoo.
如果查看docker ps
,您的容器仍在运行,但现在它没有“foo”标记,因为该标记已移动到某个新图像。但您的容器尚未更新docker build
使用您在构建时拥有的标记,但它最终是用哈希名称构建图像docker run
使用运行时的标记,但它最终是从散列名启动容器。这些标记只是被跟踪然后被遗忘的指针
编辑:虽然这是Docker在图像标签和容器名称方面的外观,但您的问题还有另一个部分,即是否可以交换底层。你不能。正如不可能在git历史的深处更改提交并让HEAD神奇地改变(您需要重写从该点到HEAD的整个历史),您也不可能更改较低的一层并让较高的一层“正常工作”。每一层都取决于它下面的层。在使用“写时复制”策略的union文件系统上构建了一个映像。图像中的所有下层都是只读的,每次我们运行一个容器时,一个新的读写层被放置在顶部,而下层保持不变
现在,关键是您可以向基础图像添加新层,而不能更改基础图像的现有层。扩展图像将仅继续使用基础图像的现有层,新层将不在此处合并。因此,扩展图像不会改变 请参见,但我想,除非您构建,否则它不会反映更改,因为图像是不可变的。您可以对容器进行一些修改,提交更改,创建新映像,但第一个映像保持不变。谢谢,这很有帮助。这似乎表明,
docker运行extendedImage
将反映在baseImage
中所做的更改,而无需重建extendedImage
——我是否正确地解释了您?我编辑了我的答案,以便更清楚地说明:不,您不能按要求做。对图层的任何更改都需要重建其上方的所有图层才能看到该更改。
e3e4a61fae2f <--- "foo"
70ba8fd71a0d
9b14cb475328
8e8d2e367ec2 <--- "bar"
8cf23a15c387
e3e4a61fae2f <--- "<none>"
70ba8fd71a0d
9b14cb475328
8e8d2e367ec2
8cf23a15c387