我正在尝试删除图像,但得到:
# 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)
您应该能够查找具有父ID的图像(以f50f9524513f开头),然后查找 这些 图像的子图像,等等。 但这 .Parent 并不是您所想的。,因此在大多数情况下,您需要在docker images --all上面进行指定以使其正常工作,然后您还将获得所有中间层的图像ID。
.Parent
docker images --all
这是一个更有限的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您可以按以下方式调用它:
desc.py
docker images \ | fgrep -f <(docker inspect --format='{{.Id}} {{.Parent}}' \ $(docker images --all --quiet) \ | python3 desc.py f50f9524513f )
或只是使用上述要点,即可完成相同的操作。