J'utilise docker via CoreOS et ECS d'AWS. J'ai eu une image défaillante qui a été redémarrée plusieurs fois, et les conteneurs sont toujours présents - ils ont rempli ma partition de disque. Plus précisément, /var/lib/docker/overlay/
contient un grand nombre de fichiers/répertoires.
Je sais que docker-cleanup-volumes est une chose, mais il nettoie le répertoire/volumes, pas le répertoire/overlay.
docker ps -a
affiche plus de 250 tentatives de démarrage sur mon conteneur docker incorrect. Ils ne courent pas, cependant.
Mis à part rm -rf /var/lib/docker/overlay/*
, comment puis-je/dois-je nettoyer cela?
De notre côté nous avons utilisé:
Sudo docker system Prune -a -f
Ce qui me sauve 3Go!
Nous utilisons aussi les fameuses commandes:
Sudo docker rm -v $(Sudo docker ps -a -q -f status=exited)
Sudo docker rmi -f $(Sudo docker images -f "dangling=true" -q)
docker volume ls -qf dangling=true | xargs -r docker volume rm
Nous mettons cela sur cron pour gérer un peu plus efficacement notre espace disque.
À votre santé
Référence: https://forums.docker.com/t/some-way-to-clean-up-identify-contents-of-var-lib-docker-overlay/30604/4
Voici la façon dont je le fais en ce moment. Je ne vais pas l'accepter comme une réponse car j'espère qu'il y a une meilleure solution.
# delete old docker processes
docker rm `docker ps -a | grep Exited | awk '{print $1 }'`
ignore_errors: true
# delete old images. will complain about still-in-use images.
docker rmi `docker images -aq`
J'ai ajouté ceci à bashrc dans mon environnement de développement, et je me suis habitué à le faire tourner tous les jours.
function cleanup_docker() {
docker ps -f status=exited -q | xargs -r docker rm
docker images -f dangling=true -q | xargs -r docker rmi
}
Dans certains cas, le script suivant peut libérer plus d'espace, car il essaiera de supprimer toutes les images et échouera simplement en mode silencieux:
function cleanup_docker_aggressive() {
for i in $(docker images --no-trunc -q | sort -u)
do
docker rmi $i 2> /dev/null
done
}
Malheureusement, ils ne sont pas beaucoup plus propres que votre solution.
EDIT: A partir de Docker 1.13, vous pouvez utiliser docker system :
docker system df # to check what is using space
docker system Prune # cleans up also networks, build cache, etc
EDIT: à partir de Docker 2017.09, vous pouvez également utiliser conteneur et image
docker container Prune
docker image Prune -a
ce dernier, vous pouvez utiliser avec des filtres de fantaisie comme --filter "until=24h"
Nous venons tout juste de commencer à avoir ce problème, et la réponse de btafarelo m'a permis de faire un bout de chemin ou au moins de me rassurer de supprimer les entrées sha256.
Informations système: instances ec2 exécutant CoreOS 1.12 derrière un ELB
Docker d'arrêt
systemctl stop docker
rm -rf /var/lib/docker/overlay/*
Exécuter les résultats des commandes
for d in $(find /var/lib/docker/image/overlay -type d -name '*sha256*'); do echo rm -rf $d/* ; done
redémarrer (moyen le plus simple de tout remettre en place)
Cette opération a permis de récupérer environ 25% du disque après le redémarrage des services, sans aucun effet indésirable.
docker ps
--silencieux
--tout
--filter status = a quitté
docker rm
images de docker
docker rmi
Votre façon de hacky va bien.
docker rm `docker ps -a | grep Exited | awk '{print $1 }'`
Ma façon hacky est
docker rm $(docker ps --all | awk '/ago/{print $1}')
Une méthode légèrement plus propre consiste à exécuter docker ps
avec l'indicateur --quiet
(-q) pour obtenir uniquement le numéro d'identification et --filter status=exited
à --filter uniquement ceux sortis.
docker rm $(docker ps --filter status=exited --quiet) # remove stopped docker processes
ou d'exécuter docker rm
avec l'indicateur --force
(-f) et docker ps
avec l'indicateur --all
(-a) pour arrêter même ceux qui sont en cours d'exécution
docker rm --force $(docker ps --all --quiet) # remove all docker processes
Ce sont probablement les images qui occupent tout cet espace disque après plusieurs générations. Pour économiser de l’espace disque sur l'hôte du menu fixe, supprimez régulièrement les images du menu fixe inutilisées avec
docker rmi $(docker images --filter dangling=true --quiet) # clean dangling docker images
ou pour devenir plus agressif, vous pouvez --force
(-f) le nettoyer des images --all
(-a)
docker rmi --force $(docker images --all --quiet) # clean all possible docker images
La manière de @analytik de le mettre dans une fonction .bashrc semble être une idée pratique
function cleanup_docker() {
docker rm --force $(docker ps --all --quiet) # remove all docker processes
docker rmi $(docker images --filter dangling=true --quiet) # clean dangling docker images
}
et si vous avez l'habitude de générer beaucoup d'images Docker dont vous n'avez pas besoin, ajoutez-les à .bash_logout
La collecte des déchets Docker peut être effectuée facilement à l'aide d'un autre conteneur Docker https://github.com/spotify/docker-gc
Vous pouvez le faire fonctionner comme un cron en utilisant https://github.com/flaccid/docker-docker-gc-crond
Vous devez inspecter vos images/conteneurs et supprimer les dossiers de/opt/docker/overlay introuvables dans l'exécution de inspect
docker inspect $(docker ps -qa) | grep -oE '[a-f0-9]{64}' >> inspect-hashs.txt
docker inspect $(docker images -qa) | grep -oE '[a-f0-9]{64}' >> inspect-hashs.txt
Sudo ls -l /var/lib/docker/overlay > overlays.txt
diff -u inspect-hashs.txt overlays.txt | grep -E '^\+' | grep -oE '[a-f0-9]{64}' | xargs Sudo rm -rf /opt/docker/overlay/
voici la résolution pour nettoyer le répertoire de superposition de docker de https://lebkowski.name/docker-volumes/
docker images --no-trunc | grep '<none>' | awk '{ print $3 }' | xargs -r docker rmi
docker ps --filter status=dead --filter status=exited -aq | xargs docker rm -v
pour Docker <1.9:
find '/var/lib/docker/volumes/' -mindepth 1 -maxdepth 1 -type d | grep -vFf <(docker ps -aq | xargs docker inspect | jq -r '.[]|.Mounts|.[]|.Name|select(.)')
Ou pour Docker> = 1.9:
docker volume ls -qf dangling=true | xargs -r docker volume rm