'码头历史'命令:为什么列标签说' IMAGE'当列包含图层?

时间:2018-04-07 19:02:26

标签: docker

我已经使用Docker几个月了,而且我还没有经常使用docker history命令。

然而,我曾经使用它的少数几次使我产生了一个假设,即存在大量依赖的图像'与我的顶级'相关联图片,而非图层

现在我已经明白,上面的大部分假设是基于这样一个事实,即很久以前,当我发出docker history命令时,最左边一列的标题是 IMAGE ,实际上,这些行确实列出了与单个图像相关联的图层,而不是图像。

以下是示例docker history命令的屏幕截图: 'IMAGE', not 'LAYER'

Docker中的图像图层之间存在严重差异,这就是为什么这真的是一个严肃的问题。

我坦率地对此问题感到非常惊讶。 Docker会怎样剥夺这种至关重要的东西?

我刚刚花了一些时间来讨论或回答这个问题。令人惊讶的是,即使Docker 'history' command documentation也没有提到这一点。唯一真实的确认'我见过来自this link

有人可以告诉我为什么docker history的列标题是' IMAGE',而条目本身就是图层?

2 个答案:

答案 0 :(得分:9)

这很复杂;)This post by Nigel Brown super 对理解这一点很有用,但我会在这里提出相关要点。

  

历史上(前Docker v1.10),每次由于提交操作而创建新图层时,Docker还会创建一个相应的图像,该图像由随机生成的256位UUID标识,通常称为图像ID(在UI中显示为短12位十六进制字符串或长64位十六进制字符串)。

所以,从历史上看,他们图像,只是那些没有“人性化”的图像。标签(虽然它们可以被标记)。

  

自Docker v1.10以来,图像和图层通常不再是同义词。相反,图像直接引用一个或多个最终贡献于派生容器的文件系统的层。

如果您在拉出的图片上执行docker history,您会看到类似的内容(摘自文章):

$ docker history swarm
IMAGE               CREATED             CREATED BY                                      
SIZE                COMMENT  
c54bba046158        9 days ago          /bin/sh -c #(nop) CMD ["--help"]                0 B  
<missing>           9 days ago          /bin/sh -c #(nop) ENTRYPOINT &{["/swarm"]}      0 B  
<missing>           9 days ago          /bin/sh -c #(nop) VOLUME [/.swarm]              0 B  
<missing>           9 days ago          /bin/sh -c #(nop) EXPOSE 2375/tcp               0 B  
<missing>           9 days ago          /bin/sh -c #(nop) ENV SWARM_HOST=:2375          0 B  
<missing>           9 days ago          /bin/sh -c #(nop) COPY dir:b76b2255a3b423981a   0 B  
<missing>           9 days ago          /bin/sh -c #(nop) COPY file:5acf949e76228329d   277.2 kB  
<missing>           9 days ago          /bin/sh -c #(nop) COPY file:a2157cec2320f541a   19.06 MB  

您会看到IMAGE列报告<missing>,这些报告不是图片,而是作为图片组成部分的图层。

所以他们不是图像!到底是什么,为什么这个专栏命名为? (回到你原来的问题)。好吧,除了......:

  

但是,如果在本地Docker主机上构建映像期间提交了一个层,那么中间层将会提交一个层。图像是同时创建的。与所有其他图像一样,它具有配置项,该配置项是要作为图像的一部分合并的层摘要的列表,并且其ID或摘要包含配置对象的散列。中间图像没有用名称标记,但是,他们确实有一个“父母”。 key,包含父图像的ID。

实际上,当你在本地构建 时,那些构成层图像(就像以前一样,即使你从其他地方拉出它们,直到v1。 10),用于促进构建缓存(如果您已经构建了该层,则构建快速构建的部分)。

所以答案是......有时它们是图像(技术上),有时它们是图层(然后在该列中表示为<missing>)。我猜它是IMAGE a)历史原因和b)因为它们实际上是出现在那里的图像时的图像,否则它只显示<missing>。我可以看到它们可能有点令人困惑,当然可能还有其他技术细节,但我希望它有所帮助!

免责声明:我为Docker工作,但我的观点/帖子是我自己的等等......

答案 1 :(得分:3)

正如约翰所提到的那样,那些实际上是图像id,是由你的本地构建产生的。如果你检查每个连续的图像id,那么这些图层会被埋得更深一点,你可以看到它们的构建。这是我在本地建立的图像:

$ docker history bmitch3020/terraform-ansible
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
c68a76df6362        2 months ago        /bin/sh -c #(nop)  ENTRYPOINT ["terraform"]     0B
32b9c2451d45        2 months ago        /bin/sh -c #(nop) COPY file:a8a964b6da98146c…   62.7MB
13543af79664        2 months ago        |1 ANSIBLE_KEY_ID=93C4A3FD7BB9C367 /bin/sh -…   80.8MB
e5c0db134950        2 months ago        /bin/sh -c #(nop)  ARG ANSIBLE_KEY_ID=93C4A3…   0B
e5153922f57d        2 months ago        /bin/sh -c apt-get update  && DEBIAN_FRONTEN…   85.9MB
874e27b628fd        5 months ago        /bin/sh -c #(nop)  CMD ["bash"]                 0B
<missing>           5 months ago        /bin/sh -c #(nop) ADD file:a71e077a42995a68f…   100MB

现在让我们浏览每个图片以查看图层(这只是docker inspect上的一个循环来查看“RootFS - &gt;图层”部分):

$ docker history bmitch3020/terraform-ansible -q \
  | while read image_id; do \
    echo "$image_id"; \
    if [ "$image_id" != "<missing>" ]; then \
      docker inspect "$image_id" --format '{{json .RootFS.Layers}}' | jq .; \
    fi; \
  done

c68a76df6362
[
  "sha256:a75caa09eb1f7d732568c5d54de42819973958589702d415202469a550ffd0ea",
  "sha256:092445cb4dbd94421917ec3db5b8d0ee2feac691d0555e24f1b7e3451b2f9caa",
  "sha256:4d221bea3442fd038aa42722b44c6633ddbd02e8d4eda1af0c84e5ef7deffe5f",
  "sha256:bd39a8a25e0f87ef27495bd23f57f651b972139c11fd05c8cd7ca79e67549ad2"
]
32b9c2451d45
[
  "sha256:a75caa09eb1f7d732568c5d54de42819973958589702d415202469a550ffd0ea",
  "sha256:092445cb4dbd94421917ec3db5b8d0ee2feac691d0555e24f1b7e3451b2f9caa",
  "sha256:4d221bea3442fd038aa42722b44c6633ddbd02e8d4eda1af0c84e5ef7deffe5f",
  "sha256:bd39a8a25e0f87ef27495bd23f57f651b972139c11fd05c8cd7ca79e67549ad2"
]
13543af79664
[
  "sha256:a75caa09eb1f7d732568c5d54de42819973958589702d415202469a550ffd0ea",
  "sha256:092445cb4dbd94421917ec3db5b8d0ee2feac691d0555e24f1b7e3451b2f9caa",
  "sha256:4d221bea3442fd038aa42722b44c6633ddbd02e8d4eda1af0c84e5ef7deffe5f"
]
e5c0db134950
[
  "sha256:a75caa09eb1f7d732568c5d54de42819973958589702d415202469a550ffd0ea",
  "sha256:092445cb4dbd94421917ec3db5b8d0ee2feac691d0555e24f1b7e3451b2f9caa"
]
e5153922f57d
[
  "sha256:a75caa09eb1f7d732568c5d54de42819973958589702d415202469a550ffd0ea",
  "sha256:092445cb4dbd94421917ec3db5b8d0ee2feac691d0555e24f1b7e3451b2f9caa"
]
874e27b628fd
[
  "sha256:a75caa09eb1f7d732568c5d54de42819973958589702d415202469a550ffd0ea"
]
<missing>

您可以从上面的检查输出中看到一些内容,从下到上:

  • “missing”:这一行是因为图像历史记录的这一部分是远程构建的,而缓存的中间图像不在本地docker主机上。
  • 874e27b628fd:这来自上游图像的泊坞窗拉动。
  • e5153922f57d:我们在一些软件包安装上添加了另一层。
  • e5c0db134950:此“nop”不会创建另一个图层,但会创建另一个图像ID。该图像id包含一些已更改的元数据,即“arg”,如果它与arg值匹配,则后续构建可以将其用作缓存。
  • 13543af79664:现在我们从原始图片中添加了两个图层。
  • 32b9c2451d45:COPY添加了一个图层,并通过缓存中添加的文件的哈希进行跟踪。
  • c68a76df6362:这又创建了另一个图像ID,而没有创建另一个文件系统层。图片ID包含更新的元数据,入口点值,最终图片ID是我的标签所指向的。