如何获取 Docker 中依赖的子镜像列表?

新手上路,请多包涵

我正在尝试删除图像,我得到:

 # 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 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 的正在运行或已停止的容器。

原文由 nicocesar 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

简短的回答: 这是一个列出依赖 docker 图像的 python3 脚本

长答案: 您可以使用以下内容查看在相关图像之后创建的所有图像的图像 ID 和父 ID:

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

您应该能够查找父 id 以 f50f9524513f 开头的图像,然后查找 这些 的子图像,等等。 但是 .Parent 不是您的想法。 ,因此在大多数情况下,您需要在上面指定 docker images --all 以使其正常工作,然后您还将获得所有中间层的图像 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 )

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

原文由 Aryeh Leib Taurog 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果您没有大量图像,则总是有蛮力方法:

 for i in $(docker images -q)
do
    docker history $i | grep -q f50f9524513f && echo $i
done | sort -u

原文由 Simon Brady 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题