Si vous n'avez pas un grand nombre d'images, il y a toujours l'approche de la force brute :
for i in $(docker images -q)
do
docker history $i | grep -q f50f9524513f && echo $i
done | sort -u
Installez dockviz et suivez les branches de l'identifiant de l'image dans l'arborescence :
go get github.com/justone/dockviz
$(go env GOPATH)/bin/dockviz images --tree -l
Réponse courte : Voici un script python3 qui répertorie les images docker dépendantes.
Réponse longue : Vous pouvez voir l'identifiant de l'image et l'identifiant parent pour toutes les images créées après l'image en question avec ce qui suit :
docker inspect --format='{{.Id}} {{.Parent}}' \
$(docker images --filter since=f50f9524513f --quiet)
Vous devriez pouvoir rechercher des images avec un identifiant parent commençant par f50f9524513f, puis rechercher des images enfants de celles , etc.. Mais .Parent
n'est pas ce que vous pensez., donc dans la plupart des cas, vous devrez spécifier docker images --all
ci-dessus pour que cela fonctionne, vous obtiendrez également des identifiants d'image pour toutes les couches intermédiaires.
Voici un script python3 plus limité pour analyser la sortie du docker et effectuer la recherche pour générer la liste des images :
#!/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))))
Si vous l'enregistrez sous desc.py
vous pouvez l'invoquer comme suit :
docker images \
| fgrep -f <(docker inspect --format='{{.Id}} {{.Parent}}' \
$(docker images --all --quiet) \
| python3 desc.py f50f9524513f )
Ou utilisez simplement l'essentiel ci-dessus, qui fait la même chose.
J'ai créé un gist avec un script shell pour imprimer l'arborescence descendante d'une image docker, si quelqu'un est intéressé par la solution 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" ""