Comment enlever les vieux conteneurs Docker

cette question est liée à devrais-je m'inquiéter de l'excès de dockers qui ne fonctionnent pas? .

je me demande comment enlever les vieux contenants. Le docker rm 3e552code34a vous permet d'en enlever un seul, mais j'en ai déjà beaucoup. docker rm --help ne donne pas d'option de sélection (comme tout, ou par nom d'image).

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

1016
demandé sur Community 2013-06-21 17:41:42

30 réponses

il y a une nouvelle caractéristique dans Docker 1.13.x appelé conteneur Docker prune : docker container prune

cela fera ce que vous voulez et devrait fonctionner sur toutes les plateformes de la même manière.

il y a aussi un Docker system prune : docker system prune , qui nettoiera les conteneurs, les images, les volumes et les réseaux en une seule commande.

Réponse Originale:

on a parlé d'un ordre de nettoyage du Docker. Vous pouvez trouver les informations sur ce ticket: implémenter une commande 'clean' (#928)

Jusqu'à ce que cette commande soit disponible, vous pouvez définir des commandes Docker avec D'autres commandes Unix pour obtenir ce dont vous avez besoin. Voici un exemple sur la façon de nettoyer les vieux contenants semaines:

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

Pour donner crédit, où il est dû, cet exemple est de https://twitter.com/jpetazzo/status/347431091415703552 .

1141
répondu Ken Cochrane 2018-07-31 13:17:05

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

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

enlèvera tous les récipients d'une 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)

mise à jour avec Docker 1.13 (Q4 2016), crédit à VonC ( plus loin dans ce fil ):

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

Voir PR 26108 et commettre 86de7c0 , qui sont l'introduction de quelques nouvelles commandes pour faciliter la visualisation de combien d'espace le démon Docker des données sur le disque et permet de facilement nettoyer excès "inutile".

docker system prune

WARNING! This will remove:
    - all stopped containers
    - all volumes not used by at least one container
    - all images without at least one container associated to them
Are you sure you want to continue? [y/N] y
589
répondu qkrijger 2017-05-23 12:10:54

"151960920 Mis" À La Réponse Utilisez docker system prune ou docker container prune maintenant. Voir réponse mise à jour de VonC .

Précédente Réponse Composant plusieurs conseils différents ci-dessus, la manière la plus élégante pour enlever tous les conteneurs non-fonctionnement semble être:

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

  • -q imprime juste les identificateurs du conteneur (sans en-tête de colonne)
  • -f vous permet de filtrer votre liste de conteneurs imprimés (dans ce cas, nous filtrons pour afficher uniquement les conteneurs sortis)
390
répondu Ryan Walls 2018-07-23 17:32:57

officiel est:

docker rm `docker ps -aq`

les responsables du Docker ont indiqué qu'il n'y aurait pas de commande pour cela - et vous composez les commandes comme cela:

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

242
répondu Michael Neale 2017-03-10 03:11:32

avec Docker 1.13 (Q4 2016), vous avez maintenant:

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

docker system prune sans -une volonté de supprimer (pour les images) seulement balançant des images, ou des images sans étiquette, , a commenté par smilebomb .

Voir PR 26108 et commettre 86de7c0 , qui sont l'introduction de quelques nouvelles commandes pour faciliter la visualisation de combien d'espace le démon Docker des données sur le disque et permet de facilement nettoyer "inutiles" à l'excès.

docker system prune -a

WARNING! This will remove:
    - all stopped containers
    - all volumes not used by at least one container
    - all images without at least one container associated to them
Are you sure you want to continue? [y/N] y

Comme wjv commentaires

Il ya aussi docker {container,image,volume,network} prune , qui peut être utilisé pour supprimer les instances non utilisées de juste un type d'objet.

introduit dans commit 913e5cb , uniquement pour Docker 1.13+.

docker container prune
110
répondu VonC 2018-07-20 15:04:17

il est maintenant possible d'utiliser filtrage avec docker ps :

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

et pour images :

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

cependant, l'un de ceux-ci causera docker rm ou docker rmi de jeter une erreur quand il n'y a pas de conteneurs correspondants. L'ancien docker rm $(docker ps -aq) était encore pire, car il essayait d'enlever tout contenant courant, échouant à chacun.

un script de nettoyage à ajouter dans votre ~/.bashrc ou ~/.profile :

# Use `docker-cleanup --dry-run` to see what would be deleted.

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

  if [ "" == "--dry-run" ]; then
    echo "==> Would stop containers:"
    echo $EXITED
    echo "==> And images:"
    echo $DANGLING
  else
    if [ -n "$EXITED" ]; then
      docker rm $EXITED
    else
      echo "No containers to remove."
    fi
    if [ -n "$DANGLING" ]; then
      docker rmi $DANGLING
    else
      echo "No images to remove."
    fi
  fi
}

modifier: comme indiqué ci-dessous, la réponse originale était pour enlever des images, pas des conteneurs. Mise à jour pour répondre aux deux, y compris de nouveaux liens vers la documentation. Merci à Adrian (et à la réponse de Ryan) d'avoir mentionné le nouveau filtrage ps .

100
répondu caktux 2015-07-08 05:37:59

UPDATED 2017 (LA PLUS RÉCENTE)

docker container prune

- 2017 (VIEUX)

pour supprimer tous les conteneurs arrêtés 151980920""

docker rm $(docker ps -a -q)

pour supprimer tous les conteneurs" 151950920 (arrêté et NON arrêté)

docker rm  -f $(docker ps -a -q)
89
répondu levi 2017-09-11 19:46:24

supprimer tous les conteneurs arrêtés:

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

du commentaire de pauk960 :

depuis la version 1.3.0 vous pouvez utiliser des filtres Avec docker ps , au lieu de grep Exited utiliser docker ps -a -f status=exited . Et si vous utilisez -q avec elle, vous pouvez obtenir conteneur Id seulement, au lieu de la sortie complète, pas besoin d'utiliser awk.

47
répondu montells 2017-05-23 12:03:09

si vous n'aimez pas retirer tous les contenants, vous pouvez sélectionner tous les contenants créés avant ou après un contenant spécifique avec docker ps --before <container-ID> ou avec docker ps --since <container-ID> . Cette fonctionnalité est au moins dans la version 0.6.5 de Docker.

disons que vous avez développé votre système, et maintenant il fonctionne, mais il reste un certain nombre de conteneurs. Vous souhaitez supprimer les conteneurs créés avant cette version de travail. Déterminer L'identification du conteneur de travail avec docker ps .

enlever les contenants créés avant un autre contenant

docker rm $(docker ps --before 9c49c11c8d21 -q)

autre exemple. Vous avez déjà votre base de données sur un conteneur Docker. Vous avez développé votre application pour fonctionner sur un autre conteneur et maintenant vous avez un certain nombre de conteneurs inutiles.

enlever les contenants créés après un certain contenant

docker rm $(docker ps --since a6ca4661ec7f -q)

Docker stocke des conteneurs dans /var/lib/docker/containers à Ubuntu. Je pense que les conteneurs supplémentaires ne font pas d'autre mal, mais prennent de l'espace disque.

31
répondu vesako 2018-07-23 17:19:17

mise à Jour: de Docker version 1.13 (janvier 2017), vous pouvez émettre la commande suivante pour nettoyer cessé de conteneurs, la partie inutilisée des volumes, balançant des images et non utilisés des réseaux:

docker system prune

si vous voulez vous assurer que vous ne supprimez que les conteneurs qui ont le statut exited , utilisez ceci:

docker ps -aq -f status=exited | xargs docker rm

de même, si vous nettoyez des trucs docker, vous pouvez vous débarrasser de non étiquetés, sans nom images de cette façon:

docker images -q --no-trunc -f dangling=true | xargs docker rmi
29
répondu L0j1k 2017-01-22 10:35:26

Voici mon script docker-cleanup , qui supprime les conteneurs et les images non étiquetés. Veuillez vérifier la source pour toute mise à jour.

#!/bin/sh
# Cleanup docker files: untagged containers and images.
#
# Use `docker-cleanup -n` for a dry run to see what would be deleted.

untagged_containers() {
  # Print containers using untagged images:  is used with awk's print: 0=line, 1=column 1.
  docker ps -a | awk ' ~ "[0-9a-f]{12}" {print $''}'
}

untagged_images() {
  # Print untagged images:  is used with awk's print: 0=line, 3=column 3.
  # NOTE: intermediate images (via -a) seem to only cause
  # "Error: Conflict, foobarid wasn't deleted" messages.
  # Might be useful sometimes when Docker messed things up?!
  # docker images -a | awk ' == "<none>" {print $''}'
  docker images | tail -n +2 | awk ' == "<none>" {print $''}'
}

# Dry-run.
if [ "" = "-n" ]; then
  echo "=== Containers with uncommitted images: ==="
  untagged_containers 0
  echo

  echo "=== Uncommitted images: ==="
  untagged_images 0

  exit
fi

# Remove containers with untagged images.
echo "Removing containers:" >&2
untagged_containers 1 | xargs --no-run-if-empty docker rm --volumes=true

# Remove untagged images
echo "Removing images:" >&2
untagged_images 3 | xargs --no-run-if-empty docker rmi

Source: https://github.com/blueyed/dotfiles/blob/master/usr/bin/docker-cleanup

19
répondu blueyed 2018-07-23 17:21:59

retirant tous les conteneurs de L'enveloppe des fenêtres:

FOR /f "tokens=*" %i IN ('docker ps -a -q') DO docker rm %i
10
répondu Bartosz Bilicki 2016-04-13 11:45:10

d'abord, arrêtez de faire fonctionner les contenants avant de tenter de les enlever."

retirer les conteneurs en marche

docker rm $(docker stop -t=1 $(docker ps -q))

vous pouvez utiliser kill au lieu de stop . Dans mon cas, je préfère stop car j'ai tendance à les relire contre créer un nouveau à chaque fois donc j'essaie de les éteindre gentiment.

Note: essayer d'arrêter un conteneur vous donnera une erreur:

erreur: Impossible de retirer un conteneur en cours d'exécution, s'il vous plaît arrêter en premier

retirer tous les conteneurs

docker rm $(docker ps -a -q)
10
répondu Ulises 2018-07-23 17:18:01

https://github.com/HardySimpson/docker-cleanup

Docker de nettoyage

une minuscule coquille tout-en - un, qui enlève:

  • les Conteneurs qui ne fonctionne pas plus qu'un jour il y a
  • Images qui n'appartiennent à aucun conteneur restant

L'intention de courir comme un emploi crontab

Fonctionnalité

  • Il va supprimer tous les <none>:<none> images
  • si l'image contient plusieurs références à repo:tag, elle supprimera toutes les références à repo:tag sauf avec l'exécution d'un conteneur. En fait c'est une nature de "docker rmi".
  • de nombreux messages d'erreur seront affichés à l'écran, et vous pouvez décider de 2>/dev/null ou non
  • apprendre quelque chose de docker-gc, et corriger son problème (il ne peut pas supprimer l'image qui a repo mutliple: tag)
7
répondu HardySimpson 2016-03-03 19:50:40

utiliser:

docker rm -f $(docker ps -a -q)

il arrête et enlève de force tous les conteneurs présents localement.

7
répondu Shashank G 2017-03-10 03:55:44

donc, personnellement, je vous recommande de le faire dans le cadre de votre script de déploiement pour les images et les conteneurs, en ne conservant que les conteneurs n Les plus récents et les images. J'étiquette mes images de Docker avec le même schéma de version que j'utilise avec git tag et j'étiquette toujours la dernière image de Docker avec "Dernière."Cela signifie que sans nettoyer quoi que ce soit, mes images de Docker finissent par ressembler à:

REPOSITORY              TAG       IMAGE ID        CREATED         VIRTUAL SIZE
some_repo/some_image    0.0.5     8f1a7c7ba93c    23 hours ago    925.4 MB
some_repo/some_image    latest    8f1a7c7ba93c    23 hours ago    925.4 MB
some_repo/some_image    0.0.4     0beabfa514ea    45 hours ago    925.4 MB
some_repo/some_image    0.0.3     54302cd10bf2    6 days ago      978.5 MB
some_repo/some_image    0.0.2     0078b30f3d9a    7 days ago      978.5 MB
some_repo/some_image    0.0.1     sdfgdf0f3d9a    8 days ago      938.5 MB

Maintenant, bien sûr, je ne veux pas garder toutes mes images (ou containers) de revenir à perpétuité sur toutes mes boîtes de production. Je veux juste les derniers 3 ou 4 pour les retours et me débarrasser de tout le reste. Le tail d'Unix est votre meilleur ami. Puisque docker images et docker ps commandent tous les deux par date, nous pouvons juste utiliser tail pour sélectionner tous sauf les trois premiers et les supprimer:

docker rmi $(docker images -q | tail -n +4)

exécutez cela avec vos scripts de déploiement (ou localement) pour toujours garder juste assez d'images pour se retourner confortablement sans prendre trop de pièce ou d'encombrer les trucs avec de vieilles images.

personnellement, je ne garde qu'un seul conteneur sur ma boîte de production à tout moment, mais vous pouvez faire le même genre de chose avec des conteneurs si vous en voulez plus:

docker rm $(docker ps -aq | tail -n +4)

enfin, dans mon exemple simplifié, nous ne traitons que d'un dépôt à la fois, mais si vous en avez plus, vous pouvez simplement obtenir un peu plus sophistiqué avec la même idée. Disons que je veux juste garder les trois dernières images de some_repo / some_image. Je peux simplement mélanger dans grep et awk et être sur mon chemin:

docker rmi $(docker images -a | grep 'some_repo/some_image' | awk '{print }' | tail -n +4)

encore une fois, la même idée s'applique aux conteneurs, mais vous l'obtenez par ce point donc je vais arrêter de donner des exemples.

6
répondu Eli 2018-07-23 17:25:13

enlever tous les contenants arrêtés.

sudo docker rm $(sudo docker ps-a-q)

il s'agit d'enlever tous les conteneurs arrêtés en obtenant une liste de tous les conteneurs avec docker ps-a-q et en passant leurs ID à docker rm. Cela ne devrait pas supprimer les conteneurs en cours d'exécution, et il vous dira qu'il ne peut pas supprimer une image en cours d'exécution.

supprimer toutes les images non étiquetées

Maintenant, vous voulez nettoyer les vieilles images d'économiser de l'espace.

sudo docker rmi $(sudo Docker images-q --filter "dangling=true")

5
répondu Ric_Harvey 2015-11-05 12:25:08

Supprimer 5 récipients les plus anciens:

docker rm `docker ps -aq | tail -n 5`

voir combien de conteneurs il reste:

docker ps -aq | wc -l
4
répondu Pithikos 2014-08-08 09:32:48

Nouvelle façon: spotify / docker-gc joue le jeu.

 docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v /etc:/etc spotify/docker-gc
  • les conteneurs qui sont sortis il y a plus d'une heure sont enlevés.
  • Images qui n'appartiennent à aucun conteneur restant après avoir été enlevées

Il a pris en charge les paramètres d'environnement

Forcer la suppression des images de plusieurs balises

 FORCE_IMAGE_REMOVAL=1

Forcer la suppression de conteneurs

 FORCE_CONTAINER_REMOVAL=1 

à L'exclusion des contenants et des Images récemment sortis de la collecte des ordures

 GRACE_PERIOD_SECONDS=86400

ce paramètre empêche également la suppression des images qui ont été créées il y a moins de secondes que GRACE_PERIOD_SECONDES.

dry run

 DRY_RUN=1

nettoyage des volumes de conteneurs orphelins CLEAN_UP_VOLUMES=1

référence: docker-gc

la Vieille façon de faire:

supprimer

"
 docker ps -a -q -f status=exited | xargs --no-run-if-empty docker rm
             OR 
 docker rm $(docker ps -a -q)

supprimer toutes les images associées aux conteneurs docker non en marche

 docker images -q | xargs --no-run-if-empty docker rmi

nettoyage des volumes orphelins des dockers pour la version 1.10.x et plus

 docker volume ls -qf dangling=true | xargs -r docker volume rm

basé sur la période

 docker ps -a | grep "weeks ago" | awk "{print }" | xargs --no-run-if-empty docker rm
 docker ps -a | grep "days ago" | awk "{print }" | xargs --no-run-if-empty docker rm
 docker ps -a | grep "hours ago" | awk "{print }" | xargs --no-run-if-empty docker rm
4
répondu f-society 2016-11-20 10:51:15
  1. supprimer tous les processus docker:

    docker rm $(docker ps -a -q)
    
  2. supprimer le conteneur spécifique:

    $ docker ps -a (lists all old containers)
    
    $ docker rm container-Id
    
4
répondu padakpadak 2017-03-10 03:08:40

vous pouvez utiliser la commande suivante pour retirer les conteneurs sortis:

docker rm $(sudo docker ps -a | grep Exit | cut -d ' ' -f 1)

Voici l'essentiel pour supprimer aussi les vieilles images sur docker: Gist pour supprimer les vieux conteneurs Docker et les images .

4
répondu urodoz 2017-03-10 03:13:30

Les étapes de base pour arrêter/supprimer tous les conteneurs et les images

  1. énumérer tous les conteneurs

    docker ps -aq

  2. Arrêter l'exécution de tous les conteneurs

    docker stop $(docker ps -aq)

  3. retirer tous les contenants

    docker rm $(docker ps -aq)

  4. supprimer toutes les images

    docker rmi $(docker images -q)

Note: vous devez d'abord arrêter tous les conteneurs avant de les enlever. Aussi avant de retirer une image, vous devez arrêter et enlever son ou ses conteneurs dépendants.

4
répondu Murali Manchadikkal 2018-07-23 17:46:58
#!/bin/bash
# docker-gc --- Remove stopped docker containers

RUNNING=$(docker ps -q)
ALL=$(docker ps -a -q)

for container in $ALL ; do
    [[ "$RUNNING" =~ "$container" ]] && continue
    echo Removing container: $(docker rm $container)
done
3
répondu mckoss 2014-05-25 23:53:22

j'utilise toujours docker rmi $(docker ps -a -q) pour supprimer toutes les images.

vous pouvez supprimer le répertoire /var/lib/docker/graph lorsque docker rmi a échoué.

3
répondu sunny 2017-03-10 03:07:41

vous ne pouvez retirer que les conteneurs arrêtés. Arrêtez-les tous au début

docker stop $(docker ps -a -q)

ensuite ,vous pouvez supprimer

docker rm $(docker ps -a -q)

3
répondu Marcin Szymczak 2017-05-24 19:11:09

essayez cette commande pour nettoyer les conteneurs et les images pendantes.

docker system prune -f
3
répondu Pal 2018-02-08 21:58:23

pour retirer tous les récipients sans crier:

sudo docker ps -a | grep -v CONTAINER | awk '{print }' | xargs --no-run-if-empty sudo docker rm -f
2
répondu Felipe 2015-02-06 03:11:43

Pour toute personne intéressée, j'ai pris l'exemple de qkrijger et en a fait un clear all (tout supprimer)

docker stop `docker ps --no-trunc -aq` ; docker rm `docker ps --no-trunc -aq`
2
répondu Kraig McConaghy 2015-04-09 06:13:56
docker rm --force `docker ps -qa`
2
répondu Sivalingam 2016-10-24 20:57:55

supprimer tous les conteneurs créés à partir d'une certaine image:

docker rm  $(docker ps -a | awk '/myimage:mytag/{print }')
2
répondu estani 2017-03-10 03:09:41