如果基础泊坞窗图像更改,是否自动更改相关图像?

假设我有一个Dockerfile,在其中我使用FROM指令来构build基于其他图像的图像。

例如,我的image,名为extendedImage ,以FROM baseImage ,然后安装其他东西。

现在,说baseImage得到更新。 我用docker pull baseImage更新。 现在,如果我docker run extendedImage ,它会反映在baseImage所做的更改吗? 或者,我必须第一次docker build extendedImage 再次 docker build extendedImage ,让它反映更新的baseImage

图像是由图层构build而成的,每个图层的实际名称是其哈希值,而不是其标签。

我有一个叫做“foo”的图像,它是从“bar”构build的,但是我真正拥有的是这个(最上面的图层):

 e3e4a61fae2f <--- "foo" 70ba8fd71a0d 9b14cb475328 8e8d2e367ec2 <--- "bar" 8cf23a15c387 

(所以我们可以看到,我的“foo”Dockerfile在FROM之后必须有3个命令,而“bar”有一个在基本层之后)。

如果我改变这些标签,图像不会改变,因为我只是移动一些指针而图像的所有部分仍然存在:

 e3e4a61fae2f <--- "<none>" 70ba8fd71a0d 9b14cb475328 8e8d2e367ec2 8cf23a15c387 

试试这个: docker run -d foo ,然后进行一些修改, docker build -t foo .

如果你看docker ps ,你的容器仍在运行,但是现在它没有“foo”标签,因为标签被移动到了一些新的图像上。 但是你的容器还没有更新。 docker build使用您在构build时拥有的标签,但最终会使用哈希名称构build映像。 docker run使用你有一个运行时间标签,但它最终从哈希名称开始一个容器。 标签只是指针,然后被忘记。

编辑:虽然这是Docker在图片和容器名称上的标签,但是您的问题还有另一个组件,也就是您是否可以换出底层。 你不能。 就像无法改变你的git历史深处的提交并且头部奇迹般地改变(你需要重写从那一点到头部的整个历史),你不能改变较低层,并且只有上层”。 每层取决于它下面的图层。

图像build立在使用“写入时复制”策略的联合文件系统上。 图像中的所有较低层都是只读的,每次运行容器时,都会在顶部放置一个新的读写层,使底层保持原样。

现在重点是你可以添加一个新的图层到基础图像,你不能改变现有的基础图像层。 扩展后的图像只会继续使用现有的基础图层,新的图层将不会被合并到这里。 因此,扩展图像不会改变。