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?
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 .
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
"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)
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.
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
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
.
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)
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 degrep Exited
utiliserdocker 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.
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.
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
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
retirant tous les conteneurs de L'enveloppe des fenêtres:
FOR /f "tokens=*" %i IN ('docker ps -a -q') DO docker rm %i
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)
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)
utiliser:
docker rm -f $(docker ps -a -q)
il arrête et enlève de force tous les conteneurs présents localement.
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.
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")
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
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
-
supprimer tous les processus docker:
docker rm $(docker ps -a -q)
-
supprimer le conteneur spécifique:
$ docker ps -a (lists all old containers) $ docker rm container-Id
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 .
Les étapes de base pour arrêter/supprimer tous les conteneurs et les images
-
énumérer tous les conteneurs
docker ps -aq
-
Arrêter l'exécution de tous les conteneurs
docker stop $(docker ps -aq)
-
retirer tous les contenants
docker rm $(docker ps -aq)
-
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.
#!/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
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é.
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)
essayez cette commande pour nettoyer les conteneurs et les images pendantes.
docker system prune -f
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
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`
supprimer tous les conteneurs créés à partir d'une certaine image:
docker rm $(docker ps -a | awk '/myimage:mytag/{print }')