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

183

我正在尝试删除一张图片,但是出现了以下提示:

# 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。


23
为什么 Docker 团队不能提供一种本地化的方法来实现这个?请问您的看法? - Alkanshel
1
我完全同意@Alkanshel的观点,但对我来说,这不仅仅是一个不便,也是一个安全问题。无论是docker-cli还是docker-hub都没有提供更直接的方法来查找镜像中包含了什么。为什么获取这些信息如此困难? - Axel Heider
13个回答

0

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

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

在这个目录中,您可以找到Docker镜像,因此您可以删除您想要的内容。

我正在尝试使用Docker API创建可移植命令,但假设使用Device Mapper和Docker引擎(而不是例如Docker Swarm)会使其成为非可移植解决方案。此外,在其他进程(包括Docker守护程序)可能正在使用文件系统时删除文件是有风险的。 - nicocesar
在 macOS 上它在哪里? - Anthony Kong
2
警告:这可能会导致未来删除和拉取容器时出现多个错误。请勿直接手动删除/var/lib/docker目录中的文件夹。 - vladkras

0
我编写了这个程序来递归查找子元素、它们的仓库标签,并打印出它们正在做什么:
docker_img_tree() {
    for i in $(docker image ls -qa) ; do
        [ -f "/tmp/dii-$i"  ] || ( docker image inspect $i > /tmp/dii-$i)
        if grep -qiE 'Parent.*'$1 /tmp/dii-$i ; then
            echo "$2============= $i (par=$1)"
            awk '/(Cmd|Repo).*\[/,/\]/' /tmp/dii-$i | sed "s/^/$2/"
            docker_img_tree $i $2===
        fi
    done
}

如果您的主机不安全,请不要忘记删除 /tmp/dii-*。


-7

我之前也遇到了同样的问题。按照以下步骤解决问题:

停止所有正在运行的容器

docker stop $(docker ps -aq) 删除所有容器

docker rm $(docker ps -aq) 删除所有镜像

docker rmi $(docker images -q)


把以下关于编程的内容从英语翻译成中文。只返回翻译后的文本。 - Ankur Loriya
请停止评论那些人们可能会复制粘贴并做出有害行为的内容。 - nicocesar

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