GNU/Linux >> Tutoriels Linux >  >> Linux

Comment obtenir la liste des images enfants dépendantes dans Docker ?

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

Linux
  1. Comment lister les dépendances d'un paquet sous Linux

  2. Comment rechercher, extraire, répertorier et supprimer des images Docker sous Linux

  3. Comment obtenir en toute sécurité la version de Ksh ?

  4. Comment puis-je obtenir des informations sur le conteneur Docker Linux à partir du conteneur lui-même ?

  5. comment obtenir une liste des clients wifi connectés dans OpenWrt 10.03 ?

Comment lister les membres d'un groupe sous Linux

Comment trouver la liste des référentiels installés sous Linux

Comment obtenir l'adresse IP d'un conteneur Docker à partir de l'hôte

Comment mettre à jour les images Docker vers la dernière version

Comment obtenir une liste de liens symboliques sous Linux

Comment répertorier / rechercher / extraire des images docker sous Linux