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" ""