如果基本泊坞窗图像发生变化,相关图像是否会自动更改?

nsh*_*eff 7 docker

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

例如,我的图像,称为extendedImage,开头FROM baseImage,然后只是安装其他东西.

现在,说得baseImage更新.我拉了更新docker pull baseImage.现在,如果我docker run extendedImage,它会反映所做的改变baseImage吗?或者必须首先我docker build extendedImage 再次得到它反映更新baseImage

Nat*_*rot 5

图像是由图层构建的,每个图层的实际名称是其哈希值,而不是其标记.

我有一个我称之为"foo"的图像,它是从"bar"构建的,但我真正拥有的是这个(最新的图层在顶部):

e3e4a61fae2f  <--- "foo"
70ba8fd71a0d
9b14cb475328
8e8d2e367ec2  <--- "bar"
8cf23a15c387
Run Code Online (Sandbox Code Playgroud)

(所以我们可以看到我的"foo"Dockerfile必须在之后有3个命令FROM,而"bar"在一些基础层之后有一个命令.)

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

e3e4a61fae2f  <--- "<none>"
70ba8fd71a0d
9b14cb475328
8e8d2e367ec2
8cf23a15c387
Run Code Online (Sandbox Code Playgroud)

试试这个:docker run -d foo然后做一些改变docker build -t foo .

如果你看一下docker ps,你的容器仍在运行,但现在它没有"foo"标签,因为该标签被移动到一些新图像.但是您的容器尚未更新.docker build使用您在构建时拥有的标记,但它最终使用哈希名称构建图像.docker run使用你有运行时的标签,但它最终从哈希名称开始一个容器.标签只是指针被跟随然后被遗忘.

编辑:虽然这就是Docker在图像上的标签和容器名称方面的样子,但问题的另一个组成部分是,您是否可以换出底层图层.你不能.就像在你的git历史中更改一个提交并让HEAD神奇地改变(你需要将整个历史记录从那一点重写为HEAD)一样,你无法改变一个较低的层并让上层"只是工作" ".每层取决于它下面的层.