GNU/Linux >> Linux の 問題 >  >> Linux

Dockerで依存する子イメージのリストを取得するには?

膨大な数の画像がない場合は、常に力ずくのアプローチがあります:

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 イメージを一覧表示する python3 スクリプトを次に示します。

長い答え: 問題のイメージの後に作成されたすべてのイメージのイメージ 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 )

または、同じことを行う上記の要点を使用してください。


シェル スクリプトを使用して要点を作成し、docker イメージの子孫ツリーを出力しました。bash ソリューションに興味がある方はこちらをご覧ください:

#!/bin/bash
parent_short_id=$1
parent_id=`docker inspect --format '{{.Id}}' $1`

get_kids() {
    local parent_id=$1
    docker inspect --format='ID {{.Id}} PAR {{.Parent}}' $(docker images -a -q) | grep "PAR ${parent_id}" | sed -E "s/ID ([^ ]*) PAR ([^ ]*)/\1/g"
}

print_kids() {
    local parent_id=$1
    local prefix=$2
    local tags=`docker inspect --format='{{.RepoTags}}' ${parent_id}`
    echo "${prefix}${parent_id} ${tags}"

    local children=`get_kids "${parent_id}"`

    for c in $children;
    do
        print_kids "$c" "$prefix  "
    done
}

print_kids "$parent_id" ""

Linux
  1. Linuxでパッケージの依存関係を一覧表示する方法

  2. Kshのバージョンを安全に入手する方法は?

  3. zip内のディレクトリのリストを取得するには?

  1. LinuxでDockerイメージを検索、プル、リスト、および削除する方法

  2. Ubuntuで最新バージョンのWinetrickを入手するにはどうすればよいですか?

  3. Dockerイメージを変更する方法

  1. Dockerコンテナを一覧表示する方法

  2. コンテナー自体から Docker Linux コンテナー情報を取得するにはどうすればよいですか?

  3. OpenWrt 10.03 で接続されている wifi クライアントのリストを取得する方法は?