wenn ich Docker-Images ausführe, habe ich unten docker images
eine 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 latest
den 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 latest
Bilder und speichert das Bild, wenn es das Repository noch nicht gespeichert hat. Um Letzteres festzustellen, wird die Tatsache, wenn ein Bild gespeichert wird, im saved
Array aufgezeichnet; vor dem Speichern eines Bildes wird das Array überprüft, um festzustellen, ob bereits ein Bild mit demselben Repository gespeichert wurde.
docker images
listet 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