Когда я запускаю образы Docker, у меня есть docker images
список, в котором есть образы с несколькими тегами, а также образ с последним значением тега.
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
Пока я это делаю, for i in {docker image save -o <imagename>.tar}
я бы хотел сохранять образы как tar только для тега с большими номерами, но за исключением любого образа Docker с latest
тегом и именем образа Docker, как m4
показано ниже. Как этого можно добиться с помощью однострочной команды.
решение1
Предположим, что это bash. Вот «однострочник», который делает это:
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
Разделим так, чтобы было понятно:
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
Это объявляет ассоциативный массив saved
, перечисляет изображения только с их репозиторием и тегом, пропускает latest
изображения и сохраняет изображение, если оно еще не сохранило репозиторий. Чтобы определить последнее, когда изображение сохраняется, этот факт записывается в массив saved
; перед сохранением изображения массив проверяется, чтобы увидеть, было ли уже сохранено изображение с тем же репозиторием.
docker images
выводит список изображений, начиная с самого последнего, поэтому это позволит сохранить самое последнее изображение, если в одном и том же репозитории (или под одним и тем же именем) находится несколько изображений.
Нет никакой специальной обработки имени tarball, поэтому он может не сделать то, что вам нужно, с репозиториями, содержащими слеши. Также нет обработки образов без репозитория или тега. Следующая более длинная версия создает подкаталоги по мере необходимости и пропускает непомеченные образы:
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