Comment supprimer les images Docker en fonction du nom?

93

Je souhaite supprimer toutes les versions des images docker dont les noms contiennent une chaîne donnée ( imagename).
J'ai essayé ce qui suit, mais cela ne semble pas fonctionner:

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

Aditya Singh
la source

Réponses:

136

Essayez ce qui suit:

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

Windows PowerShell:

docker rmi $(docker images --format "{{.Repository}}:{{.Tag}}"|findstr "imagename")
Randonneur
la source
17
La version actuelle de Docker prend en charge ceci (pas de grep): docker rmi $ (docker images 'imagename')
Charlie
La version actuelle de Docker semble prendre en charge cela - peut-être que je manque quelque chose? - docker rmi 'imagename'
Charlie
10
@Charlie Je pense que la plupart des gens cherchent un moyen de faire correspondre toutes les images qui correspondent à « imagename » plutôt qu'une seule image nommée exactement «imagename».
RJFalconer
1
J'obtiens cette erreur suivante: "docker rmi nécessite au moins 1 argument."
michali
@michali Cela signifie qu'aucune image correspondante n'est renvoyée.Pouvez-vous vérifier qu'il existe une entrée correspondante en exécutant simplement:docker images |grep 'imagename'
Rambler
71

Version légèrement plus exacte - grepping uniquement sur le nom du référentiel:

docker rmi $(docker images --format '{{.Repository}}:{{.Tag}}' | grep 'imagename')
Elton Stoneman
la source
25
cela ne supprime que les images marquées comme les plus récentesdocker rmi $(docker images --format '{{.Repository}}:{{.Tag}}' | grep 'imagename')
Drew
Merci! C'était ce que je cherchais.
Hardhik
26
docker rmi $(docker images --format '{{.Repository}}:{{.Tag}}' | grep 'imagename')
theoneandonlyak
la source
1
Pouvez-vous expliquer ce que cela fait? Les bits de code aléatoire peuvent être dangereux.
kilojoules
6
docker images --format '{{.Repository}}:{{.Tag}}filtre la sortie afin que seuls repo et tag soient affichés (ie foo:latest). grep 'imagenamefiltre ces lignes uniquement sur les images qui contiennent imagename. Mettre cela dans $()évalue cela et passe à l'extérieur docker rmiqui supprime les images qui correspondent.
Adam Parkin
En développant ce qui précède, vous pouvez supprimer toutes les images taguées correspondant à un nom d'image exact comme suit:docker rmi -f $(docker images --format '{{.Repository}}:{{.Tag}}' --filter=reference='imagename:*')'
timmins
1
sur windows "grep" n'existe pas (cmd ou powershell) Ce qui suit peut être utilisé sur les veuvesdocker rmi $( docker images --format '{{.Repository}}:{{.Tag}}' | Select-String -Pattern 'imagename')
Zameer Fouzan
20

docker imagesutilise en fait le premier argument de position comme nom d'image à filtrer. Aucun grep et awk requis. L' -qoption renverra uniquement les identifiants d'images correspondants qui peuvent être alimentés docker rmi.

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

Le uniqest nécessaire pour supprimer les doublons, au cas où vous auriez la même image étiquetée différemment.

udondan
la source
C'est sûrement la meilleure option aujourd'hui. Pour garder la cohérence de la question, le nom de l'image doit être entre guillemets.
Colm Bhandal le
8

Vous pouvez simplement ajouter --forceà la fin de la commande. Comme:

sudo docker rmi <docker_image_id> --force

Pour le rendre plus intelligent, vous pouvez arrêter tout conteneur en cours d'exécution avant de supprimer l'image:

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

Dans docker ps, $ 1 est la 1ère colonne, c'est-à-dire l'identifiant du conteneur Docker et $ 3 est la 3ème colonne, c'est-à-dire l'identifiant de l'image docker

kushalbhattad
la source
5

Je trouve ma réponse plus simple.

Exemple, le nom de votre image est python_image.

Ensuite, votre code devrait être :

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

J'espère que ça aide.

Reamon C. Sumapig
la source
Pouvons-nous faire cela pour plusieurs images en fonction du nom générique?
variable
3

J'ai également eu une autre réponse concise. Le seul changement a été de supprimer l' -I {}indicateur inutile .

docker images | grep 'imagename' | xargs docker rmi

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

Cela supprimera toutes les images du nom "imageName". Dans certains cas, cela peut donner une erreur comme "l'image est référencée dans un ou plusieurs référentiels". Dans ce cas, utilisez la suppression forcée.

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

Une autre façon peut être:

docker images | awk '{ OFS = ":" }$1 ~ /imageName/ {print $1,$2}'
zaman sakib
la source
3

Pour une raison quelconque, je n'ai pu utiliser aucune des réponses données ici. Voici ce qui a fonctionné pour moi.

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

awk '{print $3}'est une partie importante. Il extrait l'id de la 3ème colonne.

Sergeyz
la source
3

Pour moi travaillé ( Docker version 19.03.5 ):

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

La commande " docker images 'imagename' -q " listera toutes les images id de l'argument guillemet simple, donc en le concaténant avec docker rmi (ou docker rmi -f pour forcer), il supprimera toutes les images avec le nom sélectionné

Giuse Petroso
la source
1
docker rmi $(docker image ls repo/image_name* | awk {'print $1":"$2'} )
Michael A.
la source
0

Remarque mineure: d'après ce que nous vivons, il semble que vous ne soyez plus en mesure de supprimer les images non marquées en fonction du nom depuis le docker 18.03. Vous devez soit utiliser le nom + étiquette comme indiqué ci-dessus, soit utiliser l'ID.

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

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

par exemple si j'ai les images suivantes

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

Puis docker rmi $(docker images --filter=reference="abcd*:*4.0")supprimera les quatre premières images.

Pour plus d'informations, veuillez consulter https://docs.docker.com/engine/reference/commandline/images/

HarryQ
la source
fonctionne, mais il vaudrait mieux ajouter '-q' à la commande docker images: docker rmi $(docker images -q --filter=reference="IMAGENAME:TAG")
troyfolger
0

Mettre en place une solution à cette question pour répondre à mes besoins, qui n'a pas été publiée auparavant.

Je voulais faire correspondre les images construites localement: library/myappque je l' ai renommé, tagged, et poussé à une prise en pension privé: myrepo.org/library/myapp. Une fois qu'ils sont poussés, je veux nettoyer le registre local des dockers.

Et je m'en fiche si rien n'est trouvé ou si la commande génère une erreur. Ainsi ajouté || trueà la fin pour inclusion dans les scripts.

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

Sur la base de la réponse de @ Aditya, vous pouvez également créer une fonction bash pour supprimer les images à l'aise. Mettez cette fonction dans votre ~/.profile. Créez une nouvelle session shell ou créez-la par source ~/.profile.

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

Usage:

drmi golang
Halil Kaskavalci
la source
0

Informatif:

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

Donnez cette erreur:

Réponse d'erreur du démon: format de référence non valide

Probablement parce que mes images ressemblent à ceci:

hostname:5000/imagename:<none>

J'ai dû utiliser l'identifiant de l'image et faire cette commande:

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

Pour supprimer les conteneurs sortis:

docker container rm `docker container ls -a --format "{{.ID}} {{.Image}} {{.Status}}" |grep Exited |grep imagename|cut -d ' ' -f1`
Martin P.
la source