comment nettoyer le répertoire Docker overlay?

je dirige docker via CoreOS et L'ECS D'AWS. J'ai eu une image défaillante qui a été redémarrée plusieurs fois, et les conteneurs sont toujours autour - ils rempli ma cloison de commande. Plus précisément, /var/lib/docker/overlay/ contient un grand nombre de fichiers/répertoires.

je sais que menu fixe-nettoyage-volumes est une chose, mais elle nettoie le répertoire / volumes, pas le répertoire / overlay.

docker ps -a montre plus de 250 essais de démarrage sur mon mauvais conteneur docker. Ils ne sont pas en cours d'exécution, bien.

mis à part <!-Comment puis-je / devrais-je nettoyer ça?

16
demandé sur tedder42 2015-07-30 01:29:16

8 réponses

voilà comment je fais ça en ce moment. Je ne vais pas l'accepter comme une réponse parce que j'espère qu'il y a un meilleur moyen.

# delete old docker processes
docker rm `docker ps -a | grep Exited | awk '{print  }'`
  ignore_errors: true

# delete old images. will complain about still-in-use images.
docker rmi `docker images -aq`
10
répondu tedder42 2015-08-08 03:26:08

à Partir de notre côté, nous avons utilisé:

sudo docker system prune -a -f

Qui me sauvent 3Go !

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 mettre sur cron pour gérer un peu plus efficacement notre espace disque.

Cheers

Référence: https://forums.docker.com/t/some-way-to-clean-up-identify-contents-of-var-lib-docker-overlay/30604/4

6
répondu user3774109 2017-09-11 15:51:43

nous venons juste de commencer à avoir ce problème, et la réponse de btafarelo m'a obtenu une partie du chemin, ou au moins m'a fait me sentir mieux au sujet de supprimer les entrées sha256.

info Système: EC2 instances exécutant CoreOS 1.12 derrière un ELB

  • Vidanger le docker instance de l'ELB
  • Arrêt docker

    systemctl stop docker
    rm -rf /var/lib/docker/overlay/*
    
  • Executer 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émarrage (plus facile ) manière de tout ramener jusqu')

cela a récupéré environ 25% du disque après le redémarrage des services sans aucun effet de côté.

5
répondu Kevin McFadden 2017-05-31 20:20:52

j'ai ajouté ceci à bashrc dans mon environnement dev, et je me suis habitué à le faire fonctionner 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 silence:

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: à partir de Docker 2017.09, vous pouvez remplacer ces deux - là par juste

docker container prune
docker image prune -a

le dernier que vous pouvez utiliser avec fantaisie filtres comme --filter "until=24h"

3
répondu analytik 2017-12-26 15:44:54

docker ps

  • -- quiet

  • --

  • --filter status=quitté


panneau rm

  • -- force

panneau des images

  • -- quiet
  • --
  • --filtre balançant=true

menu fixe rmi

  • -- force

Votre hacky façon est bien.

docker rm `docker ps -a | grep Exited | awk '{print  }'`

Mon hacky moyen est

docker rm $(docker ps --all | awk '/ago/{print }')

une façon légèrement plus propre est de courir docker ps--quiet (-q) drapeau, pour obtenir le numéro d'identification et --filter status=exited --filtrer l'a quitté.

docker rm $(docker ps --filter status=exited --quiet) # remove stopped docker processes

exécuter docker rm--force (-f), le drapeau et l' docker ps--all (-a) drapeau pour arrêter même la course ceux

docker rm --force $(docker ps --all --quiet) # remove all docker processes

ce qui prend probablement tout cet espace disque après plusieurs compilations ratées, ce sont les images. Pour conserver l'espace disque sur l'hôte docker, supprimez périodiquement les images inutilisées avec

docker rmi $(docker images --filter dangling=true --quiet) # clean dangling docker images

ou obtenir plus agressif, vous pouvez --force (-f) pour nettoyer --all (-a) les images

docker rmi --force $(docker images --all --quiet) # clean all possible docker images

la façon de@analytik de le mettre dans un .bashrc la fonction semble comme une pratique idée

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 de docker images que vous n'avez pas besoin, ajouter .bash_logout


2
répondu woodvi 2015-12-04 18:03:19

Docker la collecte des ordures peut se faire facilement en utilisant un autre conteneur docker https://github.com/spotify/docker-gc

Vous pourriez le faire fonctionner comme un cron à l'aide de https://github.com/flaccid/docker-docker-gc-crond

1
répondu Foreever 2016-10-01 07:04:49

vous devez inspecter vos images/conteneurs et supprimer les dossiers dans /opt / docker / overlay qui n'a pas été trouvé dans l'exécution d'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
répondu btafarelo 2017-05-26 18:49:03

voici la résolution pour nettoyer le répertoire de superposition docker de https://lebkowski.name/docker-volumes/

docker images --no-trunc | grep '<none>' | awk '{ print  }' | 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
répondu Wolvverine 2018-05-09 14:01:43