web-dev-qa-db-fra.com

comment nettoyer le répertoire de superposition de docker?

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?

23
tedder42

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

12
user3774109

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`
10
tedder42

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"

7
analytik

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

  • Drainer l'instance de docker de l'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.

4
Kevin McFadden

docker ps

  • --silencieux

  • --tout

  • --filter status = a quitté


docker rm

  • --Obliger

images de docker 

  • --silencieux
  • --tout
  • --filter dangling = true

docker rmi

  • -- Obliger

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


2
woodvi

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

1
Foreever

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/
1
btafarelo

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
0
Wolvverine