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版本:

 # 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的容器。

简短的回答: 这是一个python3脚本 ,列出相关的docker图像。

长答案:你可以看到所有图像后,有问题的图像与以下所示的图像ID和父ID:

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

你应该能够find图像与父母身份证从f50f9524513f开始,然后寻找那些孩子的图像等。 .Parent 不是你的想法。 ,所以在大多数情况下,您将需要指定docker images --all以上所有的工作,那么你会得到所有中间层的图像id。

下面是一个更有限的python3脚本来parsingdocker的输出,并执行search来生成图像列表:

 #!/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 ) 

或者只是使用上面的要点 ,也是一样的。

如果你没有大量的图像,总是有powershell的方法:

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

安装dockviz并在树视图中按照图像ID分支:

 go get github.com/justone/dockviz $(go env GOPATH)/bin/dockviz images --tree -l 

您可以通过Docker的下面的目录来删除Docker镜像,而不考虑父子关系

 /var/lib/docker/image/devicemapper/imagedb/content/sha256 

在这个目录中你可以findDocker镜像,这样你就可以删除你想要的东西。

这是我为了保留我的最终“图像”(层,真的 – 这是扔了我,因为我刚刚进入docker构build)。

我得到了整个“…不能被迫…”的消息。 我意识到我不能删除我不需要的图像,因为它们不是由“docker commit”创build的真正独立的图像。 我的问题是,我有几个图像(或图层)之间的基本形象和我的决赛,只是试图清理是我遇到的错误/警告关于孩子和父母。

  1. 我把最后的图像(或者图层,如果你愿意的话)导出到一个tar包中。
  2. 然后我删除了我想要的所有图像,包括我的最后一张 – 我把它保存到了一个tarball,所以当我不确定我能否使用它时,我只是在试验。
  3. 然后我运行“docker image load -i FinalImage.tar.gz”。 输出是这样的:7d9b54235881:加载图层[======================================= ===========>] 167.1MB / 167.1MB c044b7095786:加载图层[=========================== =======================>] 20.89MB / 20.89MB fe94dbd0255e:加载图层[=============== ===================================>] 42.05MB / 42.05MB 19abaa1dc0d4:加载图层[=== ===============================================>] 37.96 MB / 37.96MB 4865d7b6fdb2:加载图层[========================================= =========>] 169.6MB / 169.6MB a0c115c7b87c:加载图层[============================= =====================>] 132MB / 132MB图片编号:sha256:82d4f8ef9ea1eab72d989455728762ed3c0fe35fd85acf9edc47b41dacfd6382

现在,当我用“docker image ls”列出的时候,我只有原始的基础图像,以及之前保存在tarball中的最终图像。

[root @ docker1〜]#docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE httpd import 82d4f8ef9ea1 3天前747MB centos httpd 36540f359ca3 5周前193MB


我的系统现在是“干净的”。 我只有我想要的图像。 我甚至删除了基本的形象没有问题。

[root @ docker1〜]#docker rmi 36540f359ca3 Untagged:centos:httpd Untagged:centos @ sha256:c1010e2fe2b635822d99a096b1f4184becf5d1c98707cbccae00be663a9b9131删除:sha256:36540f359ca3b021d4b6a37815e9177b6c2bb3817598979ea55aee7ecc5c2c1f