cuando ejecuto imágenes de la ventana acoplable, tengo a continuación docker images
una 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 latest
etiqueta 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 latest
imá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 saved
matriz; Antes de guardar una imagen, se verifica la matriz para ver si ya se ha guardado una imagen con el mismo repositorio.
docker images
enumera 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