Come rimuovere le immagini docker in base al nome?


93

Voglio eliminare tutte le versioni delle immagini docker con nomi che contengono una determinata stringa ( imagename).
Ho provato quanto segue, ma non sembra funzionare:

docker images | grep 'imagename' | xargs -I {} docker rmi

Risposte:


135

Prova quanto segue:

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

Windows Powershell:

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

17
La versione corrente di Docker supporta questo (no grep): docker rmi $ (immagini docker 'nome immagine')
Charlie

La versione attuale di Docker sembra supportare questo - forse mi manca qualcosa? - docker rmi 'imagename'
Charlie

10
@Charlie Penso che la maggior parte delle persone stia cercando un modo per abbinare tutte le immagini che corrispondono a " nome immagine " piuttosto che una singola immagine denominata esattamente "nome immagine".
RJFalconer

1
Ricevo il seguente errore: "docker rmi richiede almeno 1 argomento."
michali

@michali Significa che non è stata restituita alcuna immagine corrispondente. Puoi verificare che sia presente una voce corrispondente eseguendo:docker images |grep 'imagename'
Rambler

71

Versione leggermente più esatta - grepping solo sul nome del repository:

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

25
questo rimuove solo le immagini contrassegnate come ultimedocker rmi $(docker images --format '{{.Repository}}:{{.Tag}}' | grep 'imagename')
Drew

Grazie! Questo era quello che stavo cercando.
Hardhik

26
docker rmi $(docker images --format '{{.Repository}}:{{.Tag}}' | grep 'imagename')

1
Puoi spiegare cosa fa? Bit di codice casuale potrebbero essere pericolosi.
kilojoule

6
docker images --format '{{.Repository}}:{{.Tag}}filtra l'output in modo che siano mostrati (cioè foo:latest) solo repo e tag . grep 'imagenamefiltra quelle righe solo per quelle immagini che contengono imagename. Mettendolo in si $()valuta che & passi a quello esterno docker rmiche rimuove quelle immagini che sono state abbinate.
Adam Parkin

Espandendo quanto sopra, puoi eliminare tutte le immagini contrassegnate corrispondenti a un nome immagine esatto come segue:docker rmi -f $(docker images --format '{{.Repository}}:{{.Tag}}' --filter=reference='imagename:*')'
timmins

1
su windows "grep" non esiste (cmd o powershell) Quanto segue può essere usato sulle vedovedocker rmi $( docker images --format '{{.Repository}}:{{.Tag}}' | Select-String -Pattern 'imagename')
Zameer Fouzan

20

docker imagesutilizza effettivamente il primo argomento posizionale come nome di immagine per cui filtrare. Non sono richiesti grep e awk. L' -qopzione restituirà solo gli ID immagine corrispondenti a cui è possibile fornire docker rmi.

docker rmi --force $(docker images -q 'imagename' | uniq)

Il uniqè necessario per rimuovere i duplicati, nel caso in cui si ha la stessa immagine contrassegnata in modo diverso.


Questa è sicuramente l'opzione migliore oggi. Per mantenere la coerenza della domanda, anche se il nome dell'immagine dovrebbe essere tra virgolette.
Colm Bhandal

8

Semplicemente puoi aggiungere --forcealla fine del comando. Piace:

sudo docker rmi <docker_image_id> --force

Per renderlo più intelligente puoi interrompere qualsiasi contenitore in esecuzione prima di rimuovere l'immagine:

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

In docker ps, $ 1 è la prima colonna, ovvero ID contenitore docker e $ 3 è la terza colonna, ovvero ID immagine docker


5

Trovo la mia risposta più semplice.

Esempio, il nome della tua immagine è python_image.

Quindi il tuo codice dovrebbe essere :

docker rmi $(docker images --filter=reference='python_image' --format "{{.ID}}")

Spero che questo possa essere d'aiuto.


Possiamo farlo per più immagini in base al nome del carattere jolly?
variabile

3

Ho anche ricevuto un'altra risposta concisa. L'unico cambiamento è stato rimuovere il -I {}flag non necessario .

docker images | grep 'imagename' | xargs docker rmi


3
docker rmi `docker images | awk '$1 ~ /imageName/ {print $3}'`

Questo rimuoverà tutte le immagini per nome "imageName". In alcuni casi questo può dare un errore come "l'immagine è referenziata in uno o più repository". In tal caso, usa la cancellazione forzata.

docker rmi -f `docker images | awk '$1 ~ /imageName/ {print $3}'`

Un altro modo può essere:

docker images | awk '{ OFS = ":" }$1 ~ /imageName/ {print $1,$2}'

3

Per qualche motivo non sono stato in grado di utilizzare nessuna delle risposte fornite qui. Ecco cosa ha funzionato per me.

docker images | grep \"gcr.io/kubernetes-learn-197422/last-week-weather-service\" | awk '{print $3}' | xargs docker rmi

awk '{print $3}'è una parte importante. Estrae l'id dalla terza colonna.


3

Per me ha funzionato ( Docker versione 19.03.5 ):

docker rmi $(docker images 'imagename' -q)

Il comando " docker images 'imagename' -q " elencherà tutte le immagini id del singolo argomento tra virgolette quindi concatenandolo con docker rmi (o docker rmi -f per forzare) rimuoverà tutte le immagini con il nome selezionato


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

0

Nota minore: da quello che stiamo vivendo, sembra che dalla finestra mobile 18.03 non sia più possibile rimuovere le immagini senza tag in base al solo nome. È necessario utilizzare il nome + tag come indicato sopra o utilizzare l'ID.

docker images --format={{.ID}} | xargs -I % sh -c 'docker rmi --force % 2>&1'

0

docker rmi $(docker images --filter=reference="IMAGENAME:TAG")

per esempio se ho le seguenti immagini

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

Quindi docker rmi $(docker images --filter=reference="abcd*:*4.0")rimuoverà le prime quattro immagini.

Ulteriori informazioni vedere https://docs.docker.com/engine/reference/commandline/images/


funziona, ma sarebbe meglio aggiungere '-q' al comando docker rmi $(docker images -q --filter=reference="IMAGENAME:TAG")
docker

0

Metti insieme una soluzione a questa domanda per soddisfare le mie esigenze, che non è stata pubblicata in precedenza.

Ho voluto abbinare le immagini costruite a livello locale: library/myappche ho rinominato, etichettato, e spinto ad un repo privato: myrepo.org/library/myapp. Una volta che sono stati spinti, voglio ripulire il registro docker locale.

E non mi interessa se non viene trovato nulla o il comando genera un errore. Così aggiunto || truealla fine per l'inclusione negli script.

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

0

Sulla base della risposta di @ Aditya, puoi anche creare una funzione bash per rimuovere facilmente le immagini. Metti questa funzione nel tuo file ~/.profile. Crea una nuova sessione di shell o provala tramite source ~/.profile.

function drmi() {
    docker images | grep $1 |  xargs docker rmi
}

Utilizzo:

drmi golang

0

Informativo:

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

Dai questo errore:

Risposta di errore dal daemon: formato di riferimento non valido

Probabilmente perché le mie immagini hanno questo aspetto:

hostname:5000/imagename:<none>

Ho dovuto usare l'ID dell'immagine e fare questo comando:

docker rmi `docker images --format "{{.Repository}}:{{.Tag}} {{.ID}}" |grep imagename |grep none |cut -d ' ' -f2`

Per rimuovere i contenitori usciti:

docker container rm `docker container ls -a --format "{{.ID}} {{.Image}} {{.Status}}" |grep Exited |grep imagename|cut -d ' ' -f1`
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.