web-dev-qa-db-de.com

wie bereinigen Sie das Docker-Overlay-Verzeichnis?

Ich arbeite Docker über CoreOS und AWS ECS. Ich hatte ein fehlerhaftes Image, das viele Male neu gestartet wurde, und die Container sind immer noch in der Nähe. Sie füllten meine Festplattenpartition. Insbesondere enthält /var/lib/docker/overlay/ eine große Anzahl von Dateien/Verzeichnissen.

Ich weiß, dass Docker-Cleanup-Volumes eine Sache ist, aber es reinigt das Verzeichnis/Volumes, nicht das Verzeichnis/overlay.

docker ps -a zeigt über 250 Startversuche für meinen fehlerhaften Docker-Container. Sie laufen aber nicht.

Abgesehen von rm -rf /var/lib/docker/overlay/*, wie kann/soll ich das bereinigen?

23
tedder42

Von unserer Seite verwendeten wir:

Sudo docker system Prune -a -f

Was rettet mich 3Go!

Wir verwenden auch die berühmten Befehle:

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

Wir haben das auf cron gesetzt, um unseren Speicherplatz etwas effizienter zu verwalten.

Prost

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

12
user3774109

Hier ist die harte Art, wie ich das jetzt mache. Ich werde es nicht als Antwort akzeptieren, weil ich hoffe, dass es einen besseren Weg gibt.

# 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

Ich habe dies zu bashrc in meiner Entwicklungsumgebung hinzugefügt und habe mich daran gewöhnt, es jeden Tag oder so zu betreiben.

function cleanup_docker() {
  docker ps -f status=exited -q | xargs -r docker rm
  docker images -f dangling=true -q | xargs -r docker rmi
}

In einigen Fällen kann das folgende Skript mehr Speicherplatz freigeben, da versucht wird, alle Bilder zu entfernen, und es wird nur stummgeschaltet:

function cleanup_docker_aggressive() {
  for i in $(docker images --no-trunc -q | sort -u)
  do
    docker rmi $i 2> /dev/null
  done
}

Leider sind sie nicht wesentlich sauberer als Ihre Lösung.

BEARBEITEN: Ab Docker 1.13 können Sie das Dockersystem verwenden:

docker system df    # to check what is using space
docker system Prune # cleans up also networks, build cache, etc

BEARBEITEN: Ab Docker 2017.09 können Sie auch container und image verwenden.

docker container Prune
docker image Prune -a

letzteres können Sie mit ausgefallenen Filtern wie --filter "until=24h" verwenden.

7
analytik

Wir haben gerade angefangen, dieses Problem zu haben, und die Antwort von btafarelo brachte mich zum Teil oder brachte mich zumindest dazu, die sha256-Einträge zu entfernen.

Systeminfo: ec2-Instanzen, die CoreOS 1.12 hinter einer ELB ausführen

  • Leeren Sie die Docker-Instanz von der ELB
  • Docker herunterfahren

    systemctl stop docker
    rm -rf /var/lib/docker/overlay/*
    
  • Führen Sie die Ergebnisse der Befehle aus

    for d in $(find /var/lib/docker/image/overlay -type d -name '*sha256*'); do echo rm -rf $d/* ; done
    
  • neustart (einfachste Möglichkeit, alles wieder hochzubringen)

Nach dem Neustart der Dienste ohne schädliche Nebenwirkungen waren etwa 25% der Festplatte wiederhergestellt.

4
Kevin McFadden

docker ps

  • --ruhig

  • --alles

  • --filter status = beendet


docker rm

  • --Macht

docker-Bilder 

  • --ruhig
  • --alles
  • --filter baumelt = wahr

docker rmi

  • -- Macht

Dein gehackter Weg ist gut.

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

Mein gehackter Weg ist

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

Eine etwas sauberere Methode ist, docker ps mit dem Flag --quiet (-q) auszuführen, um nur die ID-Nummer zu erhalten und --filter status=exited, um nur die verlassenen zu filtern.

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

oder docker rm mit dem Flag --force (-f) und docker ps mit dem Code --all (-a) ausführen, um auch die laufenden zu beenden

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

Nach mehreren fehlgeschlagenen Builds benötigen die Images wahrscheinlich den gesamten Speicherplatz. Um Speicherplatz auf dem Docker-Host zu sparen, entfernen Sie nicht verwendete Docker-Images regelmäßig mit 

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

um aggressiver zu werden, können Sie --force (-f) verwenden, um --all (-a) Bilder zu bereinigen 

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

@analytiks Art und Weise, es in eine .bashrc -Funktion zu setzen, scheint eine praktische Idee zu sein

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
}

wenn Sie die Gewohnheit haben, viele Docker-Images zu generieren, die Sie nicht benötigen, fügen Sie sie zu .bash_logout hinzu.


2
woodvi

Die Docker-Garbage Collection kann auf einfache Weise mit einem anderen Docker-Container durchgeführt werden https://github.com/spotify/docker-gc

Sie könnten es als cron ausführen, indem Sie https://github.com/flaccid/docker-docker-gc-crond verwenden.

1
Foreever

Sie müssen Ihre Bilder/Container überprüfen und die Ordner in/opt/docker/overlay entfernen, die bei der Ausführung von inspect nicht gefunden wurden

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

hier ist die Auflösung, um das Docker-Overlay-Verzeichnis von https://lebkowski.name/docker-volumes/ zu löschen.

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

für 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(.)')

Oder für Docker> = 1.9:

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