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

Использование GNU awkи GNUcolumn:

awk -F'[][ ]*' '{print ($(NF-1)==n?OFS:$(NF-1)),$1; n=$(NF-1)}' OFS=, file \
 | awk -F, -v OFS=, 'NF==3{line=line RS $0;i++} NF==2{if(line)print i,line; line=$0; i=1}' \
 | column -t -n -s,

Первая команда awk извлекает и отображает нужные поля в этом формате:

Papaver_somniferum,ID1
,,ID2
,,ID3
...

Вторая команда awk строит новую строку, состоящую из всех полей с одинаковым именем, и добавляет ее счетчик впереди.

Наконец, команда столбца отображает результат в 3 столбца с помощью опции -n:

5  Papaver_somniferum    ID1
                         ID2
                         ID3
                         ID4
                         ID5
4  Helianthus_annuus     ID6
                         ID7
...
0
27.10.2021, 04:17
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перечисляет изображения, начиная с самого последнего, поэтому будет сохраняться самое последнее изображение всякий раз, когда несколько изображений используют один и тот же репозиторий (или имя ).

Нет специальной обработки имени архива, поэтому оно может не работать с репозиториями, содержащими косую черту. Также нет обработки изображений без репозитория или тега. Следующая более длинная версия создает соответствующие подкаталоги и пропускает непомеченные изображения :

.
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
0
27.10.2021, 07:25

Теги

Похожие вопросы