Como remover imagens do docker com base no nome?

96

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

Aditya Singh
fonte

Respostas:

140

Experimente o seguinte:

docker rmi $(docker images |grep 'imagename')

Windows PowerShell:

docker rmi $(docker images --format "{{.Repository}}:{{.Tag}}"|findstr "imagename")
Rambler
fonte
20
A versão atual do Docker suporta isto (sem grep): docker rmi $ (docker images 'imagename')
Charlie
A versão atual do Docker parece suportar isso - talvez eu esteja faltando alguma coisa? - docker rmi 'imagename'
Charlie
10
@Charlie Acho que a maioria das pessoas está procurando uma maneira de combinar todas as imagens que correspondam a ' imagename ' em vez de uma única imagem chamada exatamente 'imagename'.
RJFalconer
1
Estou recebendo o seguinte erro: "docker rmi requer pelo menos 1 argumento."
michali
@michali Significa que nenhuma imagem correspondente foi retornada. Você pode verificar se há uma entrada correspondente presente apenas executando:docker images |grep 'imagename'
Rambler
75

Versão um pouco mais exata - grepping apenas no nome do repositório:

docker rmi $(docker images --format '{{.Repository}}:{{.Tag}}' | grep 'imagename')
Elton Stoneman
fonte
26
isso só remove imagens marcadas como mais recentesdocker rmi $(docker images --format '{{.Repository}}:{{.Tag}}' | grep 'imagename')
Drew
Obrigado! Era isso que eu procurava.
Hardhik
26
docker rmi $(docker images --format '{{.Repository}}:{{.Tag}}' | grep 'imagename')
theoneandonlyak
fonte
1
Você pode explicar o que isso faz? Bits de código aleatório podem ser perigosos.
kilojoules
6
docker images --format '{{.Repository}}:{{.Tag}}filtra a saída para que apenas repo e tag sejam mostrados (ou seja foo:latest). grep 'imagenamefiltra essas linhas apenas para as imagens que contêm imagename. Colocar isso $()avalia e passa para o exterior, docker rmique remove as imagens que foram correspondidas.
Adam Parkin
Expandindo o acima, você pode excluir todas as imagens marcadas correspondendo a um nome de imagem exato da seguinte maneira:docker rmi -f $(docker images --format '{{.Repository}}:{{.Tag}}' --filter=reference='imagename:*')'
timmins
1
no Windows "grep" não existe (cmd ou powershell) O seguinte pode ser usado em viúvasdocker rmi $( docker images --format '{{.Repository}}:{{.Tag}}' | Select-String -Pattern 'imagename')
Zameer Fouzan
21

docker imagesna verdade, usa o primeiro argumento posicional como um nome de imagem para filtrar. Não são necessários grep e awk. A -qopçã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.

Udondan
fonte
Esta é certamente a melhor opção hoje. Para manter a consistência da pergunta, o nome da imagem deve estar entre aspas.
Colm Bhandal
8

Simplesmente você pode adicionar --forceno 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

kushalbhattad
fonte
5

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.

Reamon C. Sumapig
fonte
Podemos fazer isso para várias imagens com base no nome do curinga?
variável de
4

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

Giuse Petroso
fonte
3

Também recebi outra resposta concisa. A única mudança foi remover o -I {}sinalizador desnecessário .

docker images | grep 'imagename' | xargs docker rmi

Aditya Singh
fonte
3
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}'
Zaman Sakib
fonte
3

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.

Sergeyz
fonte
1
docker rmi $(docker image ls repo/image_name* | awk {'print $1":"$2'} )
Michael A.
fonte
1

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/

HarryQ
fonte
funciona, mas seria melhor adicionar '-q' ao comando docker images: docker rmi $(docker images -q --filter=reference="IMAGENAME:TAG")
troyfolger
0

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'
Tim Chaubet
fonte
0

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/myappque 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 || trueno final para inclusão nos scripts.

docker rmi $(docker image ls */library/myApp --format '{{.Repository}}:{{.Tag}}') || true
John
fonte
0

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
Halil Kaskavalci
fonte
0

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`
Martin P.
fonte
0

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."

Nagev
fonte
0

Experimente isto:

docker images | grep 'DOCKER_IMAGE_NAME' | xargs -l bash -c 'docker rmi $0:$1' | xargs
Achyut Sarma
fonte