GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie erhalte ich die Liste der abhängigen untergeordneten Bilder in Docker?

Wenn Sie nicht viele Bilder haben, gibt es immer den Brute-Force-Ansatz:

for i in $(docker images -q)
do
    docker history $i | grep -q f50f9524513f && echo $i
done | sort -u

Installieren Sie dockviz und folgen Sie den Zweigen von der Bild-ID in der Baumansicht:

go get github.com/justone/dockviz
$(go env GOPATH)/bin/dockviz images --tree -l

Kurze Antwort: Hier ist ein Python3-Skript, das abhängige Docker-Images auflistet.

Lange Antwort: Sie können die Bild-ID und die übergeordnete ID für alle Bilder sehen, die nach dem betreffenden Bild erstellt wurden, wie folgt:

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

Sie sollten in der Lage sein, nach Bildern mit übergeordneten IDs zu suchen, die mit f50f9524513f beginnen, und dann nach untergeordneten Bildern von diesen , usw.. Aber .Parent ist nicht das, was Sie denken. Daher müssten Sie in den meisten Fällen docker images --all angeben oben, damit das funktioniert, dann erhalten Sie auch Bild-IDs für alle Zwischenebenen.

Hier ist ein eingeschränkteres Python3-Skript, um die Docker-Ausgabe zu parsen und die Suche durchzuführen, um die Liste der Bilder zu generieren:

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

Wenn Sie dies als desc.py speichern Sie könnten es wie folgt aufrufen:

docker images \
    | fgrep -f <(docker inspect --format='{{.Id}} {{.Parent}}' \
        $(docker images --all --quiet) \
        | python3 desc.py f50f9524513f )

Oder verwenden Sie einfach das Wesentliche oben, was dasselbe bewirkt.


Ich habe ein Kernstück mit Shell-Skript erstellt, um den Nachkommenbaum eines Docker-Images auszudrucken, falls jemand an einer Bash-Lösung interessiert ist:

#!/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. So listen Sie die Abhängigkeiten eines Pakets in Linux auf

  2. So suchen, ziehen, listen und löschen Sie Docker-Images unter Linux

  3. Wie bekomme ich sicher die Version von Ksh?

  4. Wie bekomme ich die neueste Version von Winetricks auf Ubuntu?

  5. Wie kann ich Docker-Linux-Containerinformationen aus dem Container selbst abrufen?

So listen Sie die Mitglieder einer Gruppe in Linux auf

So finden Sie die Liste der installierten Repositories in Linux

So erhalten Sie die IP-Adresse eines Docker-Containers vom Host

So aktualisieren Sie Docker-Images auf die neueste Version

So erhalten Sie eine Liste symbolischer Links unter Linux

So listen / suchen / ziehen Sie Docker-Images unter Linux