Comment supprimer les images de Docker?

265

J'ai les images suivantes:

alex@alexvps:~$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
<none>              <none>              70c0e19168cf        5 days ago          1.069 GB
<none>              <none>              c2ce80b62174        8 days ago          399.2 MB
<none>              <none>              60afe4036d97        8 days ago          325.1 MB

et quand j'essaie d'en supprimer un, j'obtiens:

alex@alexvps:~$ sudo docker rmi 60afe4036d97
Error: Conflict, 60afe4036d97 wasn't deleted
2014/01/28 00:54:00 Error: failed to remove one or more images

Comment est-ce que je peux les retirer? Pourquoi y a-t-il un tel conflit?

alexyz78
la source

Réponses:

478

Afin de supprimer toutes les images, utilisez la commande donnée

docker rmi $(docker images -q)

Afin de supprimer tous les conteneurs, utilisez la commande donnée

docker rm $(docker ps -a -q)

Avertissement: cela détruira toutes vos images et conteneurs. Il ne sera pas possible de les restaurer!

Cette solution est fournie par Techoverflow.net .

Ensoleillé
la source
17
Simple et droit. Vous avez également ci-dessous la commande pour forcer la suppression des images. 'docker rmi -f $ (images du docker -q)'
dimuthu
37
L'équivalent docker images -q | %{docker rmi -f $_}
PowerShell de
1
J'ai d'abord utilisé la cmd sur @muheed Comment répondre ( stackoverflow.com/a/30475249/2747020 ) pour déverrouiller la suppression de certaines images:sudo docker ps -a -q | xargs -n 1 -I {} sudo docker rm {}
Razec Luar
1
Windows PowerShell pour les conteneurs Dockerdocker ps -a -q | %{docker rm -f $_}
Dexter
1
Comme @ alexyz78 le note ci-dessous, vous pouvez maintenant l'utiliser docker system prune. Donc, pour essuyer tout: docker kill $(docker ps -q)pour arrêter les conteneurs suivis d'un docker system prune -ava tout supprimer - voir stackoverflow.com/a/44309011/247708
Bharat
101

Raison possible: La raison peut être que cette image est actuellement utilisée par un conteneur en cours d'exécution. Dans ce cas, vous pouvez répertorier les conteneurs en cours d'exécution, arrêter le conteneur correspondant, puis supprimer l'image:

docker ps
docker stop <containerid>
docker rm <containerid>
docker rmi <imageid>

Si vous ne pouvez pas trouver de conteneur par docker ps, vous pouvez l'utiliser pour répertorier tous les conteneurs déjà sortis et les supprimer.

docker ps -a | grep 60afe4036d97
docker rm <containerid>

Remarque: veillez à supprimer tous les conteneurs sortis en même temps si vous utilisez des Volume-Onlyconteneurs. Ceux-ci restent en Exitétat, mais contiennent des données utiles .

Jiri
la source
En fait, vous obtiendrez un message spécifiant cela. Peut-être qu'une autre image est basée sur celle-ci? Essayez de supprimer d'abord toutes les images que vous avez créées à partir de cette image.
qkrijger
12
J'ai pu supprimer l'image avec sudo docker ps -a | grep Exit | awk '{print $1}' | sudo xargs docker rm(merci à github.com/dotcloud/docker/issues/3258 ) puis avecsudo docker rmi 70c0e19168cf
alexyz78
2
Soyez prudent en supprimant les images en Exitétat. Si vous utilisez des conteneurs de volume de données uniquement, ils ne restent pas en cours d'exécution.
aceofspades
1
awk peut grep:awk '/Exit/ {print $1}'
Dwight Spencer
Vos commandes jettent cela Error response from daemon: No such container: .... Il est difficile de dire ce qui doit être remplacé et avec quoi dois-je le remplacer. Ne pas utiliser...
Felo Vilches
60

La raison de l'erreur est que même si l'image n'avait pas de balise, il existe toujours un conteneur créé sur cette image qui pourrait être dans l' exitedétat. Vous devez donc vous assurer que vous avez arrêté et supprimé tous les conteneurs créés sur ces images. La commande suivante vous aide à supprimer tous les conteneurs qui ne sont pas en cours d'exécution:

docker rm `docker ps -aq --no-trunc --filter "status=exited"`

Maintenant, cela supprime toutes les <none>images non intermédiaires pendantes :

docker rmi `docker images --filter 'dangling=true' -q --no-trunc`

Remarque: Pour arrêter tous les conteneurs en cours d'exécution:

docker stop `docker ps -q`
eldos
la source
1
Merci pour cela, j'ai trouvé que c'était la mise en œuvre la plus propre.
Joseph Sawyer
7
Soyez prudent si vous avez des conteneurs de volume de données car ils ont "status = exited". Cela signifie que vous perdrez toutes vos données.
Johan
19

L'image peut être actuellement utilisée par un conteneur en cours d'exécution, vous devez donc d'abord arrêter et supprimer le ou les conteneurs.

docker stop <container-name>
docker rm <container-id>

Ensuite, vous pouvez essayer de supprimer l'image:

docker rmi <image-id>

Vous devez être sûr que cette image ne dépend pas d'autres images (sinon vous devez d'abord les supprimer).

J'avais un cas étrange dans lequel je n'avais plus de conteneurs encore en vie (docker ps -a rien retourné) mais je n'ai pas réussi à supprimer l'image et sa dépendance à l'image.

Pour résoudre ces cas particuliers, vous pouvez forcer la suppression de l'image avec ceci:

docker rmi -f <image-id>
madx
la source
19

Dans Bash:

for i in `sudo docker images|grep \<none\>|awk '{print $3}'`;do sudo docker rmi $i;done

Cela supprimera toutes les images avec le nom "<aucun>". J'ai trouvé ces images redondantes.

marcell
la source
3
Cela ne répond pas à la question, mais c'est toujours très utile. Merci.
binwiederhier
5
rendre cette commande simple docker images|grep \<none\>|awk '{print $3}' | xargs docker rmi, elle peut nécessiter une sudoautorisation
Larry Cai
15

J'ai trouvé la réponse dans cette commande:

docker images --no-trunc | grep none | awk '{print $3}' | xargs docker rmi

J'ai eu votre problème lorsque j'ai supprimé certaines images utilisées, et je ne m'en suis pas rendu compte (en utilisant docker ps -a).

ivangoblin
la source
9

Depuis Docker ver. 1.13.0 (janvier 2017) il y a la system prunecommande:

$ docker system prune --help

Usage:  docker system prune [OPTIONS]

Remove unused data

Options:
-a, --all     Remove all unused images not just dangling ones
-f, --force   Do not prompt for confirmation
    --help    Print usage
alexyz78
la source
7

En plus de la réponse de Sunny:

Pour supprimer toutes les images sur une machine Windows (avec Docker pour Windows) dans une fenêtre PowerShell, procédez comme suit:

docker images -q | %{docker rmi -f $_}

Pour supprimer tous les conteneurs sur une machine Windows (avec Docker pour Windows) dans une fenêtre PowerShell, procédez comme suit:

docker ps -a -q | %{docker rm -f $_}
Paul Vogel
la source
6

Tout d'abord, supprimez tous les conteneurs à l'aide de la commande suivante

sudo docker ps -a -q | xargs -n 1 -I {} sudo docker rm {}

Ensuite, supprimez l'image par son ID à l'aide de la commande suivante

sudo docker rmi <image-id>
Muheed
la source
Il convient de noter que si cela n'est pas évident pour certains, cela supprimera tous les conteneurs Docker en cours d'exécution.
Michael Mior
4

Retirez tous les conteneurs

docker ps -q -a | xargs docker rm

Forcer la suppression de toutes les images Docker

docker rmi -f $(docker images -f dangling=true -q)
Tout est possible
la source
4

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 ajouter:

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

Ici, dans docker ps$ 1 se trouve la première colonne, c'est-à-dire l'ID du conteneur Docker.

Et docker images$ 3 est la troisième colonne, c'est-à-dire l'ID d'image Docker.

kushalbhattad
la source
3

La version la plus compacte d'une commande pour supprimer toutes les images non balisées est:

docker rmi $(docker images | grep "^<none>" | awk '{print $"3"}')
rouge
la source
3

Pour supprimer une image Docker, vous devez exécuter la commande suivante:

$ docker rmi <docker_image_id>

Ainsi, pour supprimer toutes les images Docker, vous pouvez exécuter la commande suivante:

$ docker rmi $(docker images -q)

Maintenant, si vous souhaitez supprimer toutes les images Docker (y compris les images en cours d'utilisation), vous pouvez ajouter le drapeau -f, par exemple:

$ docker rmi -f $(docker images -q)
José David García Rodríguez
la source
3

Utilisation

docker image prune -all

ou

docker image prune -a

Supprimez toutes les images pendantes. Si -aest spécifié, il supprimera également toutes les images qui ne sont référencées par aucun conteneur.

Remarque: vous êtes invité à confirmer avant que le pruneau ne supprime quoi que ce soit, mais aucune liste de ce qui sera potentiellement supprimé ne s'affiche. De plus, docker image lsne prend pas en charge le filtrage négatif, il est donc difficile de prédire quelles images seront réellement supprimées.

Comme indiqué dans la documentation de Docker pour le pruneau .

Dylan
la source
1

Si vous souhaitez nettoyer automatiquement / périodiquement les conteneurs sortis et supprimer les images et les volumes qui ne sont pas utilisés par un conteneur en cours d'exécution, vous pouvez télécharger l'image Docker meltwater/docker-cleanup.

De cette façon, vous n'avez pas besoin de le nettoyer à la main.

Exécutez simplement:

docker run -d -v /var/run/docker.sock:/var/run/docker.sock:rw  -v /var/lib/docker:/var/lib/docker:rw --restart=unless-stopped meltwater/docker-cleanup:latest

Il s'exécutera toutes les 30 minutes (ou aussi longtemps que vous le définissez à l'aide de l'option DELAY_TIME = 1800) et nettoiera les conteneurs et les images sortants.

Plus de détails: https://github.com/meltwater/docker-cleanup/blob/master/README.md

Innocent Anigbo
la source