encontrar imágenes de Docker con etiqueta y nombre

encontrar imágenes de Docker con etiqueta y nombre

cuando ejecuto imágenes de la ventana acoplable, tengo a continuación docker imagesuna lista donde hay imágenes con múltiples etiquetas y también imágenes con el último valor de etiqueta.

REPOSITORY                            TAG                 IMAGE ID            CREATED             SIZE
m1                                  latest              40febdb010b1        15 minutes ago      479MB
m2                                    130                 fab5a122127a        4 weeks ago         2.74GB
m2                                    115                 5a2ee5c5f5e5        4 weeks ago         818MB
m3                                    111                 dd91a7f68e3d        5 weeks ago         818MB
m3                                     23                  0657662756f6        5 weeks ago         2.22GB
m4                                     23                  0657662756f6        5 weeks ago         2.22GB

Mientras lo hago, for i in {docker image save -o <imagename>.tar}me gustaría guardar solo las imágenes como tar para la etiqueta con números más altos, pero excepto cualquier imagen acoplable con latestetiqueta y nombre de imagen acoplable como m4 Cómo se puede lograr esto en un comando de una sola línea.

Respuesta1

Suponiendo que bash, aquí hay un "frase breve" que hace esto:

unset saved; declare -A saved; docker images --format '{{.Repository}} {{.Tag}}' | while read repo tag; do if [[ "$repo" == "m4" ]] || [[ "$tag" == latest ]]; then continue; fi; if [[ "${saved[$repo]}" != true ]]; then docker image save -o "$repo-$tag".tar "$repo:$tag"; saved["$repo"]=true; fi; done

Separados para que sea comprensible:

unset saved
declare -A saved
docker images --format '{{.Repository}} {{.Tag}}' | while read repo tag; do
  if [[ "$repo" == "m4" ]] || [[ "$tag" == latest ]]; then continue; fi
  if [[ "${saved[$repo]}" != true ]]; then
    docker image save -o "$repo-$tag".tar "$repo:$tag"
    saved["$repo"]=true
  fi
done

Esto declara una matriz asociativa saved, enumera las imágenes solo con su repositorio y etiqueta, omite latestimágenes y guarda la imagen si aún no ha guardado el repositorio. Para determinar esto último, cuando se guarda una imagen, ese hecho se registra en la savedmatriz; Antes de guardar una imagen, se verifica la matriz para ver si ya se ha guardado una imagen con el mismo repositorio.

docker imagesenumera las imágenes comenzando con la más reciente, por lo que guardará la imagen más reciente siempre que haya varias imágenes que compartan el mismo repositorio (o nombre).

No hay un procesamiento especial del nombre del tarball, por lo que es posible que no haga lo que busca con los repositorios que contienen barras. Tampoco hay manejo de imágenes sin repositorio o etiqueta. La siguiente versión más larga crea subdirectorios según corresponda y omite imágenes sin etiquetar:

unset saved
declare -A saved
docker images --format '{{.Repository}} {{.Tag}}' | while read repo tag; do
  if [[ "$repo" == "m4" ]] || [[ "$tag" == latest ]] || [[ "$repo" == "<none>" ]] || [[ "$tag" == "<none>" ]]; then continue; fi
  if [[ "${saved[$repo]}" != true ]]; then
    if [[ "${repo}" =~ "/" ]]; then mkdir -p "${repo%/*}"; fi
    docker image save -o "$repo-$tag".tar "$repo:$tag"
    saved["$repo"]=true
  fi
done

información relacionada