1. ホーム
  2. linux

[解決済み] Dockerで依存する子イメージのリストを取得する方法は?

2022-04-27 08:04:54

質問

画像を削除しようとしているのですが。

# 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 を持つ実行中または停止中のコンテナはありません。

解決方法は?

簡単にお答えします。 python3スクリプトを紹介します。 は、依存する docker イメージをリストアップするものです。

長い回答です。 当該画像以降に作成されたすべての画像の画像IDと親IDは、以下のようにして確認することができます。

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

親IDがf50f9524513fで始まる画像を探し、その子画像として それら などがあります。 しかし .Parent は、あなたが考えているようなものではありません。 を指定する必要がある場合がほとんどです。 docker images --all この場合、すべての中間レイヤーの画像IDも取得することになります。

docker の出力を解析し、画像のリストを生成するための、より限定的な python3 スクリプトを以下に示します。

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

または 上記の要点 ということで、同じことができます。