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

Respostas:


140

Experimente o seguinte:

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

Windows PowerShell:

docker rmi $(docker images --format "{{.Repository}}:{{.Tag}}"|findstr "imagename")

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')

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')

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.


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


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.


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


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


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}'

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.


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

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/


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'

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

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

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`

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


0

Experimente isto:

docker images | grep 'DOCKER_IMAGE_NAME' | xargs -l bash -c 'docker rmi $0:$1' | xargs
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.