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 enlever un, je reçois:
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?
Afin de supprimer toutes les images, utilisez la commande donnée
docker rmi $(docker images -q)
Pour supprimer tous les conteneurs, utilisez la commande donnée
docker rm $(docker ps -a -q)
Avertissement: Ceci détruira toutes vos images et vos conteneurs. Il ne sera pas possible de les restaurer!
Cette solution est fournie par Techoverflow.net .
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 approprié, puis supprimer l'image:
docker ps
docker stop <containerid>
docker rm <containerid>
docker rmi <imageid>
Si vous ne trouvez pas de conteneur à l'aide du menu fixe docker, 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: Faites attention à supprimer tous les conteneurs sortis en même temps si vous utilisez Volume-Only
conteneurs. Ceux-ci restent dans l'état Exit
, mais contient des données utiles.
La raison de l’erreur est que, même si l’image ne comportait aucune balise, il existait toujours un conteneur créé sur cette image, susceptible de se trouver dans l’état exited
. 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 s'exécutent pas:
docker rm `docker ps -aq --no-trunc --filter "status=exited"`
Maintenant, cela supprime toutes les images <none>
non intermédiaires:
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`
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.
L’image pouvant actuellement être utilisée par un conteneur en cours d’exécution, vous devez 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'ai eu un cas étrange dans lequel je n'avais plus de conteneurs en vie (docker ps -a
n'a rien retourné) mais je n'ai pas réussi à supprimer l'image et sa dépendance d'image.
Pour résoudre ces cas particuliers, vous pouvez forcer la suppression d'image avec ceci:
docker rmi -f <image-id>
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é des images en cours d'utilisation et je ne m'en suis pas rendu compte (avec docker ps -a
).
Depuis Docker ver. 1.13.0 (janvier 2017), il y a la commande system Prune
:
$ 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
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 en utilisant la commande suivante
Sudo docker rmi <image-id>
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 $_}
Afin de 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 $_}
Vous devez d'abord arrêter/supprimer tous les conteneurs inutiles créés sur ces images.
Jetez un coup d'oeil: Comment enlever les vieux conteneurs Docker .
Après cela, utilisez la solution @marcell.
Retirez tous les conteneurs
docker ps -q -a | xargs docker rm
Force supprime toutes les images Docker
docker rmi -f $(docker images -f dangling=true -q)
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 en tant que:
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 est 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 de Docker.
Utilisation
docker image Prune -all
ou
docker image Prune -a
Supprimez toutes les images pendantes. Si -a
est spécifié, toutes les images non référencées par un conteneur seront également supprimées.
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 ls
ne prend pas en charge le filtrage négatif, il est donc difficile de prédire quelles images seront réellement supprimées.
Comme indiqué sous documentation de Docker pour Prune .
La version la plus compacte d'une commande permettant de supprimer toutes les images non étiquetées est la suivante:
docker rmi $(docker images | grep "^<none>" | awk '{print $"3"}')
Pour supprimer une image Docker, vous devez exécuter la commande suivante:
$ docker rmi <docker_image_id>
Donc, 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 l'indicateur -f
, par exemple:
$ docker rmi -f $(docker images -q)
Si vous souhaitez nettoyer automatiquement/périodiquement les conteneurs supprimés 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 d'aller le nettoyer à la main.
Il suffit de courir:
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 quelle que soit la durée choisie à l'aide de l'option DELAY_TIME = 1800) et nettoiera les conteneurs et les images sortis.
Plus de détails: https://github.com/meltwater/docker-cleanup/blob/master/README.md
J'ai trouvé une solution avec le script Powershell qui le fera pour moi.
Le script arrête d’abord tous les conteneurs puis supprime tous les conteneurs, puis supprime les images nommées par l’utilisateur.
Regardez ici http://www.devcode4.com/article/powershell-remove-docker-containers-and-images