Wie entferne ich Docker-Bilder basierend auf dem Namen?


90

Ich möchte alle Versionen von Docker-Bildern mit Namen löschen, die eine bestimmte Zeichenfolge ( imagename) enthalten.
Ich habe das Folgende versucht, aber es scheint nicht zu funktionieren:

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

Antworten:


127

Versuche Folgendes :

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

Windows Powershell:

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

15
Aktuelle Version von Docker unterstützt dies (kein grep): Docker rmi $ (Docker-Bilder 'Bildname')
Charlie

Die aktuelle Version von Docker scheint dies zu unterstützen - vielleicht fehlt mir etwas? - Docker rmi 'imagename'
Charlie

7
@Charlie Ich denke, die meisten Leute suchen nach einer Möglichkeit, alle Bilder abzugleichen, die mit ' Bildname ' übereinstimmen , anstatt mit einem einzelnen Bild, das genau 'Bildname' heißt.
RJFalconer

Ich erhalte die folgende Fehlermeldung: "Docker-RMI benötigt mindestens 1 Argument."
Michali

@michali Es bedeutet, dass kein übereinstimmendes Bild zurückgegeben wird. Können Sie überprüfen, ob ein übereinstimmender Eintrag vorhanden ist, indem Sie einfach Folgendes ausführen:docker images |grep 'imagename'
Rambler

71

Etwas genauere Version - greift nur nach dem Repository-Namen:

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

25
Dadurch werden nur Bilder entfernt, die als aktuell markiert wurdendocker rmi $(docker images --format '{{.Repository}}:{{.Tag}}' | grep 'imagename')
Drew

Danke dir! Das war es, wonach ich gesucht habe.
Hardhik

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

1
Können Sie erklären, was dies bewirkt? Zufällige Code-Bits können gefährlich sein.
Kilojoule

6
docker images --format '{{.Repository}}:{{.Tag}}filtert die Ausgabe so, dass nur Repo & Tag angezeigt werden (dh foo:latest). grep 'imagenamefiltert diese Zeilen nur nach den Bildern, die sie enthalten imagename. Wenn Sie das eingeben, wird $()das & ausgewertet und an das Äußere übergeben, docker rmiwodurch die übereinstimmenden Bilder entfernt werden.
Adam Parkin

Wenn Sie das oben docker rmi -f $(docker images --format '{{.Repository}}:{{.Tag}}' --filter=reference='imagename:*')'
Gesagte erweitern

1
unter Windows existiert "grep" nicht (cmd oder Powershell) Folgendes kann bei Witwen verwendet werdendocker rmi $( docker images --format '{{.Repository}}:{{.Tag}}' | Select-String -Pattern 'imagename')
Zameer Fouzan

18

docker imagesVerwendet tatsächlich das erste Positionsargument als Bildnamen, nach dem gefiltert werden soll. Keine grep's und awk's erforderlich. Die -qOption gibt nur die übereinstimmenden Bild-IDs zurück, die eingegeben werden können docker rmi.

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

Das uniqist erforderlich, um Duplikate zu entfernen, falls Sie dasselbe Bild unterschiedlich markiert haben.


Dies ist heute sicherlich die beste Option. Um mit der Konsistenz der Frage Schritt zu halten, sollte der Imagename in Anführungszeichen stehen.
Colm Bhandal

7

Sie können einfach --forceam Ende des Befehls hinzufügen . Mögen:

sudo docker rmi <docker_image_id> --force

Um es intelligenter zu machen, können Sie jeden laufenden Container stoppen, bevor Sie das Image entfernen:

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 psist $ 1 die 1. Spalte, dh Docker-Container-ID, und $ 3 ist die 3. Spalte, dh Docker-Image-ID


5

Ich finde meine Antwort einfacher.

Beispiel: Ihr Bildname ist python_image.

Dann sollte Ihr Code sein :

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

Ich hoffe das hilft.


Können wir dies für mehrere Bilder basierend auf dem Platzhalternamen tun?
Variable

3

Ich habe auch eine andere prägnante Antwort bekommen. Die einzige Änderung bestand darin, das unnötige -I {}Flag zu entfernen .

docker images | grep 'imagename' | xargs docker rmi


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

Dadurch werden alle Bilder mit dem Namen "imageName" entfernt. In einigen Fällen kann dies zu einem Fehler führen, z. B. "Bild wird in einem oder mehreren Repositorys referenziert". Verwenden Sie in diesem Fall das Löschen erzwingen.

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

Ein anderer Weg kann sein:

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

3

Für mich hat funktioniert ( Docker Version 19.03.5 ):

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

Der Befehl " Docker-Bilder 'Bildname' -q " listet alle Bild-IDs des einfach in Anführungszeichen gesetzten Arguments auf. Wenn Sie es also mit Docker-Rmi (oder Docker-Rmi -f zum Erzwingen) verknüpfen , werden alle Bilder mit dem ausgewählten Namen entfernt


2

Aus irgendeinem Grund konnte ich hier keine der gegebenen Antworten verwenden. Folgendes hat bei mir funktioniert.

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

awk '{print $3}'ist ein wichtiger Teil. Es extrahiert die ID aus der 3. Spalte.


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

0

Kleinere Bemerkung: Nach dem, was wir erleben, scheinen Sie - seit Docker 18.03 - nicht mehr in der Lage zu sein, Bilder ohne Tags zu entfernen, die nur auf dem Namen basieren. Sie müssen entweder den Namen + Tag wie oben angegeben verwenden oder die ID verwenden.

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

0

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

Zum Beispiel, wenn ich die folgenden Bilder habe

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

Dann docker rmi $(docker images --filter=reference="abcd*:*4.0") werden die ersten vier Bilder entfernt.

Weitere Informationen finden Sie unter https://docs.docker.com/engine/reference/commandline/images/


funktioniert, aber es wäre besser, '-q' zum Docker-Images-Befehl hinzuzufügen: docker rmi $(docker images -q --filter=reference="IMAGENAME:TAG")
troyfolger

0

Stellen Sie eine Lösung für diese Frage zusammen, um meine Anforderungen zu erfüllen, die zuvor noch nicht veröffentlicht wurde.

Ich wollte lokal erstellte Bilder abgleichen: library/myappdie ich umbenannt, markiert und in ein privates Repo verschoben habe : myrepo.org/library/myapp. Sobald sie gepusht sind, möchte ich die lokale Docker-Registrierung bereinigen.

Und es ist mir egal, ob nichts gefunden wird oder der Befehl einen Fehler auslöst. So || trueam Ende zur Aufnahme in Skripte hinzugefügt .

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

0

Basierend auf der Antwort von @ Aditya können Sie auch eine Bash-Funktion erstellen, um Bilder bequem zu entfernen. Stellen Sie diese Funktion auf Ihre ~/.profile. Erstellen Sie eine neue Shell-Sitzung oder beziehen Sie sie von source ~/.profile.

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

Verwendung:

drmi golang

0

Information:

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

Geben Sie diesen Fehler ein:

Fehlerantwort vom Daemon: ungültiges Referenzformat

Wahrscheinlich, weil meine Bilder so aussehen:

hostname:5000/imagename:<none>

Ich musste die Bild-ID verwenden und diesen Befehl ausführen:

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

So entfernen Sie verlassene Container:

docker container rm `docker container ls -a --format "{{.ID}} {{.Image}} {{.Status}}" |grep Exited |grep imagename|cut -d ' ' -f1`
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.