确定Docker镜像是本地构建还是从仓库拉取的?

3

有没有办法判断一个Docker镜像是在本地构建的还是从远程仓库拉取的?

解释: 我们有一些大型镜像(15GB+),它们是在Docker HUB上进行自动化构建的。在开发和测试期间,通常更快地在本地构建这些镜像,但使用相同的标签,以便在构建下游镜像时可以使用它们。如果我们能够确定给定的镜像是在本地构建的还是下游构建的,那将非常有用。


从远程仓库拉取的镜像在运行 docker images 命令时应该有一个仓库,对吧?你可以应用过滤器来查看带有仓库的镜像。 - Oluwafemi Sule
@OluwafemiSule docker images 不起作用,因为我们将使用与 Docker Hub 中使用的相同标签 (org/image-name) 构建镜像。我更新了问题以提供更多上下文。 - James Dudley
1
“Docker history <image-id>” 的输出将会显示在本地 Docker 主机之外构建的每个层中缺失的镜像名称。这能解决您的问题吗? - Ahmad Abdelghany
2个回答

4

鉴于这个极简的 Dockerfile

From busybox
Run echo "My first command"
Run echo "My second command"
Run echo "My third command"

您可以使用以下命令构建Docker镜像:
$ docker build -t abdelghany/myimage .

$ docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
abdelghany/myimage            latest              159379ab5770        5 minutes ago       1.106 MB
busybox                       latest              c75bebcdd211        3 weeks ago         1.106 MB

这是这个本地构建镜像的 docker history
$ docker history abdelghany/myimage
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
7a352943082a        8 seconds ago       /bin/sh -c echo "My third command"              0 B                 
6e59deae3839        8 seconds ago       /bin/sh -c echo "My second command"             0 B                 
24df2c17994f        9 seconds ago       /bin/sh -c echo "My first command"              0 B                 
c75bebcdd211        3 weeks ago         /bin/sh -c #(nop)  CMD ["sh"]                   0 B                 
<missing>           3 weeks ago         /bin/sh -c #(nop) ADD file:5dde1d6e0f6362350d   1.106 MB  

现在,将图像推送到注册表,然后在本地删除它,并再次拉取它。
$ docker push abdelghany/myimage
$ docker rmi abdelghany/myimage
$ docker pull abdelghany/myimage

这是所拉取镜像的 docker history
$ docker history abdelghany/myimage

IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
159379ab5770        3 minutes ago       /bin/sh -c echo "My third command"              0 B                 
<missing>           3 minutes ago       /bin/sh -c echo "My second command"             0 B                 
<missing>           3 minutes ago       /bin/sh -c echo "My first command"              0 B                 
<missing>           3 weeks ago         /bin/sh -c #(nop)  CMD ["sh"]                   0 B                 
<missing>           3 weeks ago         /bin/sh -c #(nop) ADD file:5dde1d6e0f6362350d   1.106 MB
说明: docker history 显示了创建镜像层所使用的所有命令。对于本地构建的镜像,每个命令都与一个中间图像相关联,以便在构建缓存中使用(因此下次在该docker主机上构建镜像时,它会使用缓存中的中间图像)。
当移动镜像(即推送和拉取)时,您只移动最终镜像,因此当查看历史记录时,它显示<missing>,表示没有与此命令相关联的中间镜像,这表明它不是在此docker主机上构建的。

0

你可能想要查看一下docker history命令,以获取你所需要的信息。

这个命令会给出Dockerfile执行的命令,因此MAINTAINERS标签(或更正确的LABEL maintainer)可能会在历史记录中出现,从而为你提供有关镜像创建者的一些见解。


这是同一个 Dockerfile,既用于自动化的 Docker Hub 构建,也用于本地构建 - 因此“MAINTAINERS”标签是相同的。我已经更新了原始问题以提供更多上下文。 - James Dudley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接