L'erreur Docker ne peut pas supprimer le conteneur Docker, conflit: impossible de supprimer la référence au référentiel

165

Je souhaite supprimer le conteneur dans Docker, mais une erreur se produit lorsque vous souhaitez supprimer

Ma prochaine étape avant de supprimer le conteneur, voir la liste des conteneurs existants

sts@Yudi:~/docker$ sudo docker ps -as

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                    PORTS               NAMES                  SIZE
78479ffeba5c        ubuntu              "/bin/bash"         42 hours ago        Exited (0) 42 hours ago                       sharp_wescoff          81 B (virtual 187.7 MB)
0bd2b54678c7        training/webapp     "python app.py"     5 days ago          Exited (0) 5 days ago                         backstabbing_ritchie   0 B (virtual 323.7 MB)
0adbc74a3803        training/webapp     "python app.py"     5 days ago          Exited (143) 5 days ago                       drunk_feynman          0 B (virtual 323.7 MB)

celui que je souhaite supprimer la liste, à savoir "training / webapp" mais une erreur s'est produite

sts@Yudi:~/docker$ sudo docker rmi training/webapp
Error response from daemon: conflict: unable to remove repository reference "training/webapp" (must force) - container 0bd2b54678c7 is using its referenced image 54bb4e8718e8
Error: failed to remove images: [training/webapp]

Si le conteneur est en cours d'exécution dans les images?

Veuillez aider

Yuday
la source
cela m'arrive parfois, mais je suis incapable de comprendre le motif de ce qui le fait se produire (car cela ne m'arrive pas toujours), et si je force la suppression de l'image, cela supprime également un tas d'autres choses. Savez-vous ce qui a causé l'erreur pour vous? êtes-vous capable de le reproduire?
Charlie Parker
Excellent résumé récent Comment supprimer des images, des conteneurs et des volumes Docker de Melissa Anderson décembre 2017, avec des exemples de filtres, des modèles, etc.
Webel IT Australia - upvoter

Réponses:

125

Il existe une différence entre les images docker et les conteneurs docker. Vérifiez cette question SO .

En bref, un conteneur est une instance en cours d'exécution d'une image. c'est pourquoi vous ne pouvez pas supprimer une image s'il existe un conteneur en cours d'exécution à partir de cette image. Il vous suffit de supprimer d'abord le conteneur.

docker ps -a               # Lists containers (and tells you which images they are spun from)
docker images              # Lists images  
docker rm <container_id>   # Removes a container

docker rmi <image_id>      # Removes an image 
                           # Will fail if there is a running instance of that image i.e. container

docker rmi -f <image_id>   # Forces removal of image even if it is referenced in multiple repositories, 
                           # i.e. same image id given multiple names/tags 
                           # Will still fail if there is a docker container referencing image

Mise à jour pour Docker 1.13+ [depuis janvier 2017]

Dans Docker 1.13, nous avons regroupé chaque commande pour s'asseoir sous l'objet logique avec lequel elle interagit

Fondamentalement, les commandes ci-dessus pourraient également être réécrites, plus clairement, comme suit:

docker container ls -a
docker image ls
docker container rm <container_id>
docker image rm <image_id>

De plus, si vous souhaitez tout supprimer, vous pouvez utiliser:

docker system prune -a

AVERTISSEMENT! Cela supprimera:

  • tous les conteneurs arrêtés
  • tous les réseaux non utilisés par au moins un conteneur
  • toutes les images inutilisées
  • tout le cache de construction
Ahmad Abdelghany
la source
3
J'ai fini par devoir utiliser docker rmi -f idpour "forcer" la suppression.
WernerCD
@WernerCD vous -faide lorsque vous souhaitez supprimer une image référencée dans plusieurs référentiels, ce qui est une autre raison courante pour laquelle la suppression d'une image échoue.
Ahmad Abdelghany
1
à noter que docker container lsne répertorie que les conteneurs en cours d'exécution. Cela m'a dérangé jusqu'à ce que je réalise que l'ajout du -adrapeau les répertorie tous.
MFB
@MFB Bon point. Ajout de l'indicateur à la commande pour maintenir la parité entre les deux ensembles de commandes. Merci!
Ahmad Abdelghany le
fonctionne toujours sur OSX Docker Desktop v2.2.0.4 (moteur 19.03.8)
rrrrrraul
83

Tout d'abord, supprimez les noms de conteneurs

$ sudo docker rm backstabbing_ritchie

Le résultat

$ sudo docker rm backstabbing_ritchie
  backstabbing_ritchie

supprimer la deuxième partie, qui est répertoriée sur le conteneur à supprimer

$ sudo docker rm drunk_feynman 
  drunk_feynman

Deuxièmement, retirez le conteneur

$ sudo docker rmi training/webapp

Le résultat

$ sudo docker rmi training/webapp  
  Untagged: training/webapp:latest
  Deleted: 54bb4e8718e8600d78a5d7c62208c2f13c8caf0e4fe73d2bc0e474e93659c0b5
  Deleted: f74dd040041eb4c032d3025fe38ea85de8075992bdce6789b694a44b20feb8de
  Deleted: 7cbae69141977b99c44dc6957b032ad50c1379124d62b7d7d05ab7329b42348e
  Deleted: abb991a4ed5e4cde2d9964aec4cccbe0015ba9cc9838b696e7a32e1ddf4a49bd
  Deleted: 1952e3bf3d7e8e6a9b1e23bd4142e3c42ff7f4b7925122189704323593fd54ac
  Deleted: f95ebd363bf27a7546deced7a41a4099334e37a3d2901fa3817e62bb1ade183f
  Deleted: 20dd0c75901396d41a7b64d551ff04952084cc3947e66c67bae35759c80da338
  Deleted: 2505b734adda3720799dde5004302f5edb3f2a2ff71438f6488b530b728ba666
  Deleted: 2ee0b8f351f753f78f1178000ae37616eb5bf241d4ef041b612d58e1fd2aefdc
  Deleted: 2ce633e3e9c9bd9e8fe7ade5984d7656ec3fc3994f05a97d5490190ef95bce8d
  Deleted: 98b15185dba7f85308eb0e21196956bba653cf142b36dc08059b3468a01bf35d
  Deleted: 515565c29c940355ec886c992231c6019a6cffa17ff1d2abdfc844867c9080c5
  Deleted: 2880a3395eded9b748c94d27767e1e202f8d7cb06f1e40e18d1b1c77687aef77

Vérifiez le continer

  $ sudo docker ps -as
  CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                    PORTS               NAMES                  SIZE
  78479ffeba5c        ubuntu              "/bin/bash"         43 hours ago        Exited (0) 43 hours ago                       sharp_wescoff          81 B (virtual 187.7 MB)
Yuday
la source
6
Si vous avez beaucoup d'anciens conteneurs, vous pouvez également envisager rm `docker ps -aq`de supprimer docker pour le nettoyage, plutôt que de les supprimer un à la fois. Plus d'informations ici
Philiiiiiipp
Pourquoi est-il nécessaire de supprimer le nom avant de supprimer l'image? Pourquoi essayer de supprimer une image sans supprimer d'abord le nom devrait-il poser problème?
code_dredd
@code_dredd Il n'existe pas de "suppression de noms". C'est le conteneur qui doit être supprimé en premier avant de supprimer une image. Plus de détails sur stackoverflow.com/a/40283776/1998422
Ahmad Abdelghany
37

Si vous souhaitez nettoyer les images et les conteneurs du docker

ATTENTION: cela va tout rincer

arrêter tous les conteneurs

docker stop $(docker ps -a -q)

supprimer tous les conteneurs

docker rm $(docker ps -a -q)

supprimer toutes les images

docker rmi -f $(docker images -a -q)
quAnton
la source
Ça a marché. De plus, si vous arrêtez le conteneur, vous le verrez toujours dans une liste. Par conséquent, vous devez le supprimer avec docker rm $(docker ps -a -q). Merci!
28

vous pouvez utiliser l' -foption pour forcer la suppression des conteneurs.

sudo docker rmi -f training/webapp

Vous pouvez arrêter l'utilisation des conteneurs sudo docker stop training/webappavant de supprimer

Saril Sudhakaran
la source
1
Je l'ai essayé, en arrêtant le conteneur $ sudo docker stop training / webapp Réponse d'erreur du démon: aucun id: training / webapp Erreur: échec d'arrêt des conteneurs: [training / webapp]
Yuday
vous pouvez essayer de vous arrêter avec l'identifiant du conteneur sudo docker stop 0bd2b54678c7
Saril Sudhakaran
23

Si vous avez lancé plusieurs conteneurs Docker, utilisez ceci

$ docker rm $(docker ps -aq)

Il supprimera tous les dockers actuels répertoriés dans la commande "ps -aq".

Source: aaam sur https://github.com/docker/docker/issues/12487

gaël
la source
Cela a fonctionné pour moi. Après avoir exécuté cette commande, je devais ensuite exécuter docker image lset ensuite docker image rm Xoù chaque X était obtenu à partir de la lssortie.
jftuga
5

Vous avez remarqué qu'il s'agit d'une question vieille de 2 ans, mais que vous souhaitez toujours partager ma solution de contournement pour cette question particulière: tout d'

abord, exécutez docker container ls -apour lister tous les conteneurs que vous avez et identifier le souhait que vous souhaitez supprimer.

Deuxièmement, supprimez celui avec la commande docker container rm <CONTAINER ID>(si le conteneur est en cours d'exécution, vous devez d'abord l'arrêter, exécuterdocker container stop <CONTAINER ID> pour arrêter normalement le conteneur spécifié, s'il ne l'arrête pas pour quelque raison que ce soit, vous pouvez également l'exécuter docker container kill <CONTAINER ID> to force shutdown of the specified container).

Troisièmement, retirez le conteneur en exécutant docker container rm <CONTAINER ID>.

Enfin, vous pouvez exécuter docker image ls -apour afficher toutes les images et supprimer celle que vous souhaitez en exécutant docker image rm <hash>.

Utilisateur3301
la source
2

Supprimer les images du docker>

Lister tous les conteneurs

docker container ls

Lister toutes les images

docker image ls

Arrêter le conteneur par ID de conteneur

docker container stop <container_id>

Supprimer le conteneur par ID de conteneur

docker container rm <container_id>

Si vous ne voulez pas arrêter et supprimer, peut forcer la suppression

docker container rm -f <container_id>

Supprimer l'image

docker image rm <image_id>

Terminé!

Anthony Piñero
la source
2

listez toutes vos images de docker:

docker images

lister tous les conteneurs Docker existants:

docker ps -a

supprimez tous les conteneurs ciblés, qui utilisent l'image que vous souhaitez supprimer:

docker rm <container-id>

supprimer l'image ciblée:

docker rmi <image-name:image-tag or image-id>
Mhd Medfa
la source
0

Supprimer uniquement les conteneurs associés à une image spécifique

docker ps -a | grep training/webapp | cut -d ' ' -f 1 | xargs docker rm
  • ps -a: liste tous les conteneurs
  • grep training / webapp: filtrez tout sauf les conteneurs démarrés à partir de l'image training / webapp
  • cut -d '' -f 1: liste uniquement les identifiants des conteneurs (premier champ délimité par un espace)
  • xargs docker rm: envoyer la sortie de la liste des identifiants du conteneur à la commande docker rm pour supprimer le conteneur
AndrewD
la source