当前位置: 首页 > 知识库问答 >
问题:

如何在Docker中获取从属子映像列表?

申屠洛华
2023-03-14

我试图删除一个图像,我得到:

# docker rmi f50f9524513f  
Failed to remove image (f50f9524513f): Error response from daemon: conflict: unable to delete f50f9524513f (cannot be forced) - image has dependent child images

这是docker版本:

# docker version
Client:
 Version:      1.10.3
 API version:  1.22
 Go version:   go1.5.3
 Git commit:   20f81dd
 Built:        Thu Mar 10 21:49:11 2016
 OS/Arch:      linux/amd64

Server:
 Version:      1.10.3
 API version:  1.22
 Go version:   go1.5.3
 Git commit:   20f81dd
 Built:        Thu Mar 10 21:49:11 2016
 OS/Arch:      linux/amd64

但没有额外的信息:

# docker images --format="raw" | grep f50f9524513f -C3

repository: debian
tag: 8
image_id: f50f9524513f
created_at: 2016-03-01 18:51:14 +0000 UTC
virtual_size: 125.1 MB

repository: debian
tag: jessie
image_id: f50f9524513f
created_at: 2016-03-01 18:51:14 +0000 UTC
virtual_size: 125.1 MB

我如何才能获得它声称拥有的从属子映像?

没有具有该映像id的正在运行或已停止的容器。

共有3个答案

谢旻
2023-03-14

安装dockviz并遵循树状图中图像id的分支:

go get github.com/justone/dockviz
$(go env GOPATH)/bin/dockviz images --tree -l
慕弘伟
2023-03-14

简短回答:下面是一个python3脚本,它列出了依赖的docker图像。

详细回答:您可以看到在有问题的图像之后创建的所有图像的图像id和父id,如下所示:

docker inspect --format='{{.Id}} {{.Parent}}' \
    $(docker images --filter since=f50f9524513f --quiet)

您应该能够查找父id为f50f9524513f的图像,然后查找这些图像的子图像,等等。。但是.Parent并不是您所想的,所以在大多数情况下,您需要指定docker图像——上面所有的来实现这一点,然后您将获得所有中间层的图像ID。

这里有一个更有限的python3脚本来解析docker输出并进行搜索以生成图像列表:

#!/usr/bin/python3
import sys

def desc(image_ids, links):
    if links:
        link, *tail = links
        if len(link) > 1:
            image_id, parent_id = link
            checkid = lambda i: parent_id.startswith(i)
            if any(map(checkid, image_ids)):
                return desc(image_ids | {image_id}, tail)
        return desc(image_ids, tail)
    return image_ids


def gen_links(lines):
    parseid = lambda s: s.replace('sha256:', '')
    for line in reversed(list(lines)):
        yield list(map(parseid, line.split()))


if __name__ == '__main__':
    image_ids = {sys.argv[1]}
    links = gen_links(sys.stdin.readlines())
    trunc = lambda s: s[:12]
    print('\n'.join(map(trunc, desc(image_ids, links))))

如果将其保存为desc.py,则可以按如下方式调用它:

docker images \
    | fgrep -f <(docker inspect --format='{{.Id}} {{.Parent}}' \
        $(docker images --all --quiet) \
        | python3 desc.py f50f9524513f )

或者只是使用上面的要点,它做同样的事情。

边霄
2023-03-14

如果您没有大量的图像,则通常会使用暴力方法:

for i in $(docker images -q)
do
    docker history $i | grep -q f50f9524513f && echo $i
done | sort -u
 类似资料:
  • 问题内容: 我正在尝试删除图像,但得到: 这是docker版本: 但没有其他信息: 如何获得它声称拥有的 依赖子图像 ? 没有运行或停止的具有该图像ID的容器。 问题答案: 简短的答案: 这是一个python3脚本,其中列出了相关的docker映像。 长答案: 您可以看到在有问题的图像之后创建的所有图像的图像ID和父ID,如下所示: 您应该能够查找具有父ID的图像(以f50f9524513f开头)

  • 我正在基于Centos创建docker映像: 有没有一种方法,我可以得到一个列表的文件/目录安装在图像中,超过最初的centos起始图像?

  • 我可以理解,从本地机器到Minikube VM访问docker映像的不同方式。 (库伯内特斯Minikube)无法从本地注册表获取docker映像 所有这些示例都是针对Mac/Linux用户的。 我正在为Windows用户寻找一个等效的建议。 windows相当于什么-

  • 问题内容: 我正在使用docker Registry v1,并且有兴趣迁移到较新的版本v2。但是我需要某种方式来获取注册表中存在的图像列表。例如,对于注册表v1,我可以执行GET请求,结果是: 但是我在官方文档中找不到类似于在注册表中获取映像列表的内容。有人知道在新版本v2上执行此操作的方法吗? 问题答案: 对于最新(截至2015年7月31 日)的Registry V2版本,您可以从DockerH

  • 问题内容: 我想创建一个docker镜像并正确安装,因此我选择具有这些属性的基础镜像。因此,的第一行如下: 然后下一个命令是 在创建docker映像时创建了以下错误: 如何能够在此docker映像中安装? 问题答案: 如提示: 获取(13:权限被拒绝) 我相信这是由于您的基本形象: https://github.com/SeleniumHQ/docker- selenium/blob/master