поиск образов Docker по тегу и имени

поиск образов Docker по тегу и имени

Когда я запускаю образы 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

Связанный контент