GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo obtener la lista de imágenes de niños dependientes en Docker?

Si no tiene una gran cantidad de imágenes, siempre existe el enfoque de fuerza bruta:

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

Instale dockviz y siga las ramas desde la identificación de la imagen en la vista de árbol:

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

Respuesta corta: Aquí hay una secuencia de comandos python3 que enumera las imágenes acoplables dependientes.

Respuesta larga: Puede ver la identificación de la imagen y la identificación principal de todas las imágenes creadas después de la imagen en cuestión con lo siguiente:

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

Debería poder buscar imágenes con una identificación principal que comience con f50f9524513f, luego busque imágenes secundarias de esos , etc.. Pero .Parent no es lo que piensas, por lo que en la mayoría de los casos deberás especificar docker images --all anterior para que funcione, también obtendrá ID de imagen para todas las capas intermedias.

Aquí hay una secuencia de comandos python3 más limitada para analizar la salida de la ventana acoplable y realizar la búsqueda para generar la lista de imágenes:

#!/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 guarda esto como desc.py podría invocarlo de la siguiente manera:

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

O simplemente use la esencia anterior, que hace lo mismo.


Creé una esencia con un script de shell para imprimir el árbol descendiente de una imagen acoplable, en caso de que alguien esté interesado en la solución 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. ¿Cómo obtener la última versión de Winetricks en Ubuntu?

  2. Cómo listar contenedores Docker

  3. ¿Cómo puedo obtener información del contenedor de Docker Linux desde el propio contenedor?

  4. ¿Cómo obtener una lista de directorios en un zip?

  5. ¿Cómo obtener una lista de los clientes wifi conectados en OpenWrt 10.03?

Cómo enumerar los miembros de un grupo en Linux

Cómo encontrar la lista de repositorios instalados en Linux

Cómo obtener la dirección IP de un contenedor Docker desde el host

Cómo actualizar las imágenes de Docker a la última versión

Cómo obtener una lista de enlaces simbólicos en Linux

Cómo listar/buscar/extraer imágenes de la ventana acoplable en Linux