Quero excluir todas as versões de imagens do docker com nomes que contêm uma determinada string ( imagename
).
Eu tentei o seguinte, mas não parece funcionar:
docker images | grep 'imagename' | xargs -I {} docker rmi
Quero excluir todas as versões de imagens do docker com nomes que contêm uma determinada string ( imagename
).
Eu tentei o seguinte, mas não parece funcionar:
docker images | grep 'imagename' | xargs -I {} docker rmi
Respostas:
Experimente o seguinte:
docker rmi $(docker images |grep 'imagename')
Windows PowerShell:
docker rmi $(docker images --format "{{.Repository}}:{{.Tag}}"|findstr "imagename")
docker images |grep 'imagename'
Versão um pouco mais exata - grepping apenas no nome do repositório:
docker rmi $(docker images --format '{{.Repository}}:{{.Tag}}' | grep 'imagename')
docker rmi $(docker images --format '{{.Repository}}:{{.Tag}}' | grep 'imagename')
docker rmi $(docker images --format '{{.Repository}}:{{.Tag}}' | grep 'imagename')
docker images --format '{{.Repository}}:{{.Tag}}
filtra a saída para que apenas repo e tag sejam mostrados (ou seja foo:latest
). grep 'imagename
filtra essas linhas apenas para as imagens que contêm imagename
. Colocar isso $()
avalia e passa para o exterior, docker rmi
que remove as imagens que foram correspondidas.
docker rmi -f $(docker images --format '{{.Repository}}:{{.Tag}}' --filter=reference='imagename:*')'
docker rmi $( docker images --format '{{.Repository}}:{{.Tag}}' | Select-String -Pattern 'imagename')
docker images
na verdade, usa o primeiro argumento posicional como um nome de imagem para filtrar. Não são necessários grep e awk. A -q
opção retornará apenas os IDs de imagens correspondentes que podem ser alimentados docker rmi
.
docker rmi --force $(docker images -q 'imagename' | uniq)
O uniq
é necessário para remover duplicatas, caso você tenha a mesma imagem com tags diferentes.
Simplesmente você pode adicionar --force
no final do comando. Gostar:
sudo docker rmi <docker_image_id> --force
Para torná-lo mais inteligente, você pode interromper qualquer contêiner em execução antes de remover a imagem:
sudo docker stop $(docker ps | grep <your_container_name> | awk '{print $1}')
sudo docker rm $(docker ps | grep <your_container_name> | awk '{print $1}')
sudo docker rmi $(docker images | grep <your_image_name> | awk '{print $3}') --force
Em docker ps
, $ 1 é a primeira coluna, ou seja, o id do contêiner do docker e $ 3 é a terceira coluna, ou seja, o id da imagem do docker
Acho minha resposta mais simples.
Exemplo, o nome da sua imagem é python_image
.
Então, seu código deve ser :
docker rmi $(docker images --filter=reference='python_image' --format "{{.ID}}")
Eu espero que isso ajude.
Para mim funcionou ( Docker versão 19.03.5 ):
docker rmi $(docker images 'imagename' -q)
O comando " docker images 'imagename' -q " irá listar todos os id de imagens do argumento entre aspas simples, então concatená-lo com docker rmi (ou docker rmi -f para forçar) ele removerá todas as imagens com o nome selecionado
Também recebi outra resposta concisa. A única mudança foi remover o -I {}
sinalizador desnecessário .
docker images | grep 'imagename' | xargs docker rmi
docker rmi `docker images | awk '$1 ~ /imageName/ {print $3}'`
Isso removerá todas as imagens com o nome "imageName". Em alguns casos, pode ocorrer um erro como "a imagem é referenciada em um ou mais repositórios". Nesse caso, use forçar exclusão.
docker rmi -f `docker images | awk '$1 ~ /imageName/ {print $3}'`
Outra forma pode ser:
docker images | awk '{ OFS = ":" }$1 ~ /imageName/ {print $1,$2}'
Por algum motivo, não consegui usar nenhuma das respostas fornecidas aqui. Aqui está o que funcionou para mim.
docker images | grep \"gcr.io/kubernetes-learn-197422/last-week-weather-service\" | awk '{print $3}' | xargs docker rmi
awk '{print $3}'
é uma parte importante. Ele extrai o id da 3ª coluna.
docker rmi $(docker image ls repo/image_name* | awk {'print $1":"$2'} )
docker rmi $(docker images --filter=reference="IMAGENAME:TAG")
por exemplo, se eu tiver as seguintes imagens
REPOSITORY TAG IMAGE ID CREATED SIZE
abcdefg/hij 7.0.0-beta-4.0 3128835950cd 7 days ago 51.4MB
abcdefg/hij-action 7.0.0-beta-4.0 42a7255beb74 7 days ago 97.4MB
abcdefg/hij-test 7.0.0-beta-4.0 17246aed35d0 7 days ago 97.4MB
abcdefg/hij-server 7.0.0-beta-4.0 42c45e561f2c 7 days ago 335MB
abcdefg/hij-init 7.0.0-beta-3.0 f648bb622933 7 days ago 55.2MB
abcdefg/hij-dir 7.0.0-beta-3.0 0db07d3aaccf 7 days ago 97.4MB
abcdefg/hij-mount 7.0.0-beta-3.0 18d1c0e1502c 4 weeks ago 33.7MB
Em seguida docker rmi $(docker images --filter=reference="abcd*:*4.0")
, removerá as primeiras quatro imagens.
Mais informações, consulte https://docs.docker.com/engine/reference/commandline/images/
docker rmi $(docker images -q --filter=reference="IMAGENAME:TAG")
Observação secundária: pelo que estamos experimentando, parece que você - desde o docker 18.03 - não é mais capaz de remover imagens não marcadas com base apenas no nome. Você precisa usar o nome + tag conforme indicado acima ou usar o ID.
docker images --format={{.ID}} | xargs -I % sh -c 'docker rmi --force % 2>&1'
Montei uma solução para essa questão para atender às minhas necessidades, que não foi postada anteriormente.
Eu queria combinar imagens construídas localmente: library/myapp
que eu tenha renomeado, etiquetado, e empurrou a um repo privado: myrepo.org/library/myapp
. Depois que eles forem pressionados, quero limpar o docker reg local.
E não me importo se nada for encontrado ou se o comando gerar um erro. Assim, adicionado || true
no final para inclusão nos scripts.
docker rmi $(docker image ls */library/myApp --format '{{.Repository}}:{{.Tag}}') || true
Com base na resposta de @Aditya, você também pode criar uma função bash para remover imagens facilmente. Coloque esta função em seu ~/.profile
. Crie uma nova sessão de shell ou fonte por source ~/.profile
.
function drmi() {
docker images | grep $1 | xargs docker rmi
}
Uso:
drmi golang
Informativo:
docker rmi $(docker images --format "{{.Repository}}:{{.Tag}}" |grep imagename |grep none)
Dê este erro:
Resposta de erro do daemon: formato de referência inválido
Provavelmente porque minhas imagens se parecem com isto:
hostname:5000/imagename:<none>
Tive que usar o id da imagem e fazer este comando:
docker rmi `docker images --format "{{.Repository}}:{{.Tag}} {{.ID}}" |grep imagename |grep none |cut -d ' ' -f2`
Para remover contêineres de saída:
docker container rm `docker container ls -a --format "{{.ID}} {{.Image}} {{.Status}}" |grep Exited |grep imagename|cut -d ' ' -f1`
Com base na minha resposta preferida, mas com uma variável:
docker rmi --force "$(docker images -q $repository | uniq)"
E isso pode ser usado em um pipeline do Jenkins:
sh(script: 'docker rmi --force "$(docker images -q $repository | uniq)"', returnStdout: true)
Preferi esta opção em vez de remover por meio da tag:
$ docker rmi test:latest
Isso porque, como dizem os documentos e eu verifiquei, "usar este comando com a tag como parâmetro apenas remove a tag. Se a tag for única para a imagem, tanto a imagem quanto a tag são removidas."
Experimente isto:
docker images | grep 'DOCKER_IMAGE_NAME' | xargs -l bash -c 'docker rmi $0:$1' | xargs