1401 votes

Comment supprimer d'anciens conteneurs Docker

Cette question est liée à Dois-je m'inquiéter des conteneurs Docker inutiles qui ne s'exécutent pas ?.

Je me demande comment supprimer les anciens conteneurs. La commande docker rm 3e552code34a vous permet d'en supprimer un seul, mais j'en ai déjà beaucoup. La commande docker rm --help ne propose pas d'option de sélection (comme tous, ou par le nom de l'image).

Peut-être qu'il y a un répertoire dans lequel ces conteneurs sont stockés où je peux les supprimer facilement manuellement ?

22 votes

Vous devriez également envisager de nettoyer les volumes Docker orphelins. Je trouve souvent qu'ils consomment beaucoup plus d'espace que les anciens conteneurs et les anciennes images. Un bon script pour supprimer les volumes Docker orphelins est disponible sur: github.com/chadoe/docker-cleanup-volumes.

0 votes

Peut-être github.com/chadoe/docker-cleanup-volumes peut vous aider.

0 votes

Vous pouvez également utiliser docker run avec le --rm drapeau qui rendrait le conteneur éphémère, en supprimant tous les fichiers de conteneur après l'exécution.

1707voto

Ken Cochrane Points 12318

Depuis Docker 1.13.x, vous pouvez utiliser Docker container prune:

docker container prune

Cela supprimera tous les conteneurs arrêtés et devrait fonctionner de la même manière sur toutes les plateformes.

Il y a aussi un Docker system prune:

docker system prune

qui nettoiera tous les conteneurs, réseaux, images inutilisées (à la fois pendantes et non référencées), et éventuellement, les volumes, en une seule commande.


Pour les anciennes versions de Docker, vous pouvez enchaîner des commandes Docker avec d'autres commandes Unix pour obtenir ce dont vous avez besoin. Voici un exemple de nettoyage des anciens conteneurs datant de plusieurs semaines :

$ docker ps --filter "status=exited" | grep 'weeks ago' | awk '{print $1}' | xargs --no-run-if-empty docker rm

Pour rendre à César ce qui est à César, cet exemple vient de https://twitter.com/jpetazzo/status/347431091415703552.

0 votes

Merci ! Au fait, est-il possible de baliser les conteneurs ? Par exemple, on pourrait avoir une image de base de données, dont une instance (conteneur) pourrait contenir des données précieuses. Un autre outil précieux pourrait être de marquer un conteneur comme étant "utilisé", le protégeant ainsi de 'docker rm'.

0 votes

Notez que je vais mettre ces commentaires dans le problème que vous avez mentionné

98 votes

Commande similaire pour supprimer toutes les images sans balise : docker images | grep "" | awk '{print $3}' | xargs docker rmi

650voto

qkrijger Points 3310

Une autre méthode, que j'ai obtenue de Guillaume J. Charmes (crédit là où il est dû):

docker rm `docker ps --no-trunc -aq`

supprimera tous les conteneurs de manière élégante.

Et par Bartosz Bilicki, pour Windows:

FOR /f "tokens=*" %i IN ('docker ps -a -q') DO docker rm %i

Pour PowerShell:

docker rm @(docker ps -aq)

Une mise à jour avec Docker 1.13 (T4 2016), crédit à VonC (plus tard dans ce fil):

docker system prune supprimera TOUTES les données inutilisées (c'est-à-dire, dans l'ordre: conteneurs arrêtés, volumes sans conteneurs et images sans conteneurs).

Voir PR 26108 et le commit 86de7c0, qui introduisent quelques nouvelles commandes pour faciliter la visualisation de l'espace pris par les données du démon Docker sur le disque et permettre un nettoyage facile de l'"excès" inutile.

docker system prune

ATTENTION! Cela supprimera:
    - tous les conteneurs arrêtés
    - tous les volumes non utilisés par au moins un conteneur
    - toutes les images sans au moins un conteneur associé à elles
Êtes-vous sûr de vouloir continuer? [O/n] o

11 votes

Cela ne fonctionne pas pour moi, mais docker ps -a -q | xargs docker rm fonctionne, (sudo peut être nécessaire)

87 votes

Que diriez-vous de docker rm $(docker ps -a -q) ?

9 votes

@qkrijger, cela ne change rien à votre réponse initiale, sauf en ajoutant du bashisme. Le problème réside dans le débordement de la ligne de commande. La variante de xargs gère cela de manière élégante. J'ajouterais également --no-trunk à docker ps pour éviter les conflits d'ID (peu probables).

261voto

Michael Neale Points 7704

La façon officielle est :

docker rm `docker ps -aq`

Les mainteneurs de Docker ont indiqué qu'il n'y aura pas de commande pour cela - et vous composez les commandes de la manière suivante :

Nous en avons déjà discuté et préférons que les utilisateurs utilisent la ligne ci-dessus sans avoir à ajouter de code supplémentaire à Docker.

7 votes

Ceci est cependant une mauvaise solution, car cela supprimera également les conteneurs de stockage.

9 votes

Qu'entendez-vous par "conteneurs de stockage"? Si vous voulez dire des conteneurs de données qui étaient autrefois utilisés pour conserver des références aux volumes de données, ils ne sont plus nécessaires en raison de la disponibilité de la sous-commande docker volume et des volumes nommés.

0 votes

Notez que cela ne fonctionnera pas dans Windows Powershell. Pour cela, voici une meilleure solution : stackoverflow.com/a/23674294/1150683

109voto

caktux Points 181

Il est maintenant possible d'utiliser le filtrage avec docker ps:

docker rm $(docker ps -q -f status=exited)

Et pour les images:

docker rmi $(docker images -q -f "dangling=true")

Cependant, l'une ou l'autre de ces commandes provoquera une erreur lorsque docker rm ou docker rmi ne trouvera pas de conteneurs correspondants. L'ancien astuce docker rm $(docker ps -aq) était encore pire car il essayait de supprimer tous les conteneurs en cours d'exécution, échouant à chaque fois.

Voici un script plus propre à ajouter dans votre ~/.bashrc ou ~/.profile :

# Utilisez `docker-cleanup --dry-run` pour voir ce qui serait supprimé.

function docker-cleanup {
  EXITED=$(docker ps -q -f status=exited)
  DANGLING=$(docker images -q -f "dangling=true")

  if [ "$1" == "--dry-run" ]; then
    echo "==> Les conteneurs à arrêter seraient :"
    echo $EXITED
    echo "==> Et les images seraient :"
    echo $DANGLING
  else
    if [ -n "$EXITED" ]; then
      docker rm $EXITED
    else
      echo "Aucun conteneur à supprimer."
    fi
    if [ -n "$DANGLING" ]; then
      docker rmi $DANGLING
    else
      echo "Aucune image à supprimer."
    fi
  fi
}

Éditer: Comme indiqué ci-dessous, la réponse initiale concernait la suppression d'images, pas de conteneurs. Mis à jour pour répondre aux deux cas, y compris de nouveaux liens vers la documentation. Merci à Adrian (et la réponse de Ryan) d'avoir mentionné le nouveau filtrage avec ps.

2 votes

Remarquez le réel avantage de ceci - vous ne tuez pas accidentellement les conteneurs de stockage.

3 votes

Vous pouvez également utiliser status=created pour obtenir ceux qui ne sont pas en cours d'exécution et n'ont jamais été exécutés.

50voto

Michel Points 345

Supprimer tous les conteneurs arrêtés :

docker rm $(docker ps -a | grep Exited | awk '{print $1}')

De la commentaire de pauk960:

Depuis la version 1.3.0, vous pouvez utiliser des filtres avec docker ps, au lieu de grep Exited utilisez docker ps -a -f status=exited. Et si vous utilisez -q avec cela, vous pouvez obtenir uniquement les ID des conteneurs au lieu de la sortie complète, pas besoin d'utiliser awk pour cela.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X