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

# 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

我怎样才能得到它声称拥有的dependent child images个呢?

没有运行或停止的容器具有该图像id.

推荐答案

Short answer:

Long answer:

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

您应该能够查找父id从f50f9524513f开始的图像,然后查找those的子图像,等等..But .Parent isn’t what you think.,所以在大多数情况下,您需要在上面指定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 )

或者只使用the gist above,也可以做同样的事情.

Linux相关问答推荐

git别名函数可以用单引号写吗?

如何根据具体情况打印两行输出?

在CefExecuteProcess;之前创建新线程会导致CEF应用程序崩溃并显示SIGTRAP

在 Bash 中使用 shell 脚本从文件中解析版本号

如何在我的 PC 上配置 GitLab 和 GitHub ssh 密钥

Git在某些文件中添加回车符,尽管autocrlf已关闭

为什么 liburing 写入性能低于预期?

使用 grep 时如何跳过第一行和最后一行?

如何使用 awk 重新排列列?

对一个命令使用不同的 PHP 版本 CLI 可执行文件

使用正则表达式时,Shell 'tar: not found in archive' 错误

如何计算列的平均值

Linux 上的 C++ 开发 - 我从哪里开始?

未定义的引用 'shm_open',已在此处添加 -lrt 标志

如何让 PHP、Symlinks 和 __FILE__ 很好地协同工作?

C ++中套接字上的协议缓冲区

从命令行导入 PostgreSQL CSV

构建窗口管理器

crontab 在特定小时之间每 15 分钟运行一次

如何对指定路径下的所有文件执行 for-each 循环?