Docker-Images mit Tag und Name finden

Docker-Images mit Tag und Name finden

wenn ich Docker-Images ausführe, habe ich unten docker imageseine Liste, in der es Images mit mehreren Tags und auch Images mit dem aktuellsten Tag-Wert gibt.

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

Dabei for i in {docker image save -o <imagename>.tar}möchte ich die Bilder nur für die Tags mit höheren Nummern als Tar speichern, aber alle Docker-Bilder mit latestden Tags und Docker-Bildnamen ausnehmen m4 . Wie dies mit einem Einzeiler-Befehl erreicht werden kann.

Antwort1

Unter der Annahme, dass es sich um Bash handelt, ist hier ein „Einzeiler“, der dies tut:

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

Aufgeteilt, damit es verständlich ist:

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

Dies deklariert ein assoziatives Array saved, listet die Bilder nur mit ihrem Repository und Tag auf, überspringt latestBilder und speichert das Bild, wenn es das Repository noch nicht gespeichert hat. Um Letzteres festzustellen, wird die Tatsache, wenn ein Bild gespeichert wird, im savedArray aufgezeichnet; vor dem Speichern eines Bildes wird das Array überprüft, um festzustellen, ob bereits ein Bild mit demselben Repository gespeichert wurde.

docker imageslistet die Bilder beginnend mit dem aktuellsten auf. Dadurch wird das aktuellste Bild gespeichert, wenn mehrere Bilder dasselbe Repository (oder denselben Namen) verwenden.

Es gibt keine spezielle Verarbeitung des Tarball-Namens, daher funktioniert es möglicherweise nicht wie gewünscht bei Repositories mit Schrägstrichen. Bilder ohne Repository oder Tag werden ebenfalls nicht verarbeitet. Die folgende längere Version erstellt nach Bedarf Unterverzeichnisse und überspringt Bilder ohne Beschriftung:

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

verwandte Informationen