quando executo imagens do docker tenho abaixo docker images
como 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 latest
tag 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 latest
as 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 saved
array; antes de salvar uma imagem, o array é verificado para ver se uma imagem com o mesmo repositório já foi salva.
docker images
lista 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