encontrando imagens docker com tag e nome

encontrando imagens docker com tag e nome

quando executo imagens do docker tenho abaixo docker imagescomo lista onde há imagens com múltiplas tags e também imagem com valor de tag mais recente.

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

Enquanto faço isso, for i in {docker image save -o <imagename>.tar}gostaria de salvar apenas as imagens como tar para a tag com números mais altos, mas exceto qualquer imagem do docker com latesttag e nome da imagem do docker como m4 Como isso pode ser alcançado em um comando de liner.

Responder1

Assumindo o bash, aqui está uma “linha única” que faz isso:

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

Dividam-se para que seja compreensível:

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

Isso declara um array associativo saved, lista as imagens apenas com seu repositório e tag, pula latestas imagens e salva a imagem se ainda não tiver salvo o repositório. Para determinar este último, quando uma imagem é salva, esse fato é registrado no savedarray; antes de salvar uma imagem, o array é verificado para ver se uma imagem com o mesmo repositório já foi salva.

docker imageslista as imagens começando pela mais recente, então isso salvará a imagem mais recente sempre que houver várias imagens compartilhando o mesmo repositório (ou nome).

Não há processamento especial do nome do tarball, portanto ele pode não fazer o que você procura com repositórios contendo barras. Também não há manipulação de imagens sem repositório ou tag. A versão mais longa a seguir cria subdiretórios conforme apropriado e ignora imagens não rotuladas:

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

informação relacionada