Docker-Datenvolumes entfernen?

In der offiziellen Docker-Dokumentation wird erwähnt, dass ich ausführen muss docker rm -v containername um ein Datenvolume gezielt zu entfernen. Aber was tun Sie, wenn Sie bereits alle Container entfernt haben, die auf das spezifische Datenvolumen verweisen?

Vor Version 1.9 bot Docker keine Möglichkeit, baumelnde Volumes zu entfernen.

Wenn solche Volumes zu viel Speicherplatz beanspruchen und Sie die Sache selbst in die Hand nehmen möchten, können Sie die Volumes manuell löschen, indem Sie zuerst die verwendeten Volumes identifizieren. Du kannst rennen docker inspect -f '{{ .Volumes }}' containername um den Speicherort im Dateisystem der verwendeten Volumes zu finden und dann alles außer diesen zu löschen. Wenn Sie viele Container haben, können Sie ausführen for x in $(docker ps -qa | sed '1d'); do docker inspect -f '{{ .Volumes }}' ${x}; done um die Container zu durchlaufen und die Volumes aufzulisten.

Besser noch, Sie können das Python-Skript verwenden hier, die Voraussetzung ist, den Python-API-Client für Docker zu installieren pip install docker-py

Aufräumbefehle: Ab Docker 1.13 werden Aufräumbefehle eingeführt. So entfernen Sie alle nicht verwendeten Container, Images, Netzwerke und Volumes:

docker system prune

oder individuell:

docker container prune

docker image prune

docker network prune

docker volume prune

Befehl verwenden

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

um baumelnde Volumes von Docker 1.9 und höher zu löschen.

Ich habe Docker 1.6.

Die Python-Version hat bei mir nicht funktioniert, es hat sich über eine Nichtübereinstimmung der Docker-Version beschwert. Es ist erstaunlich, dass in Zeiten wie diesen nichts besser ist als die gute alte Art, Dinge zu tun.

volpurge() {    if [ $(id -u) -ne 0 ];then        echo "please run as root"        return 1    fi    BASEDIR=/var/lib/docker/vfs/dir    a=$(mktemp)    b=$(mktemp)    c=$(mktemp)    printf "checking docker volumes ... "    cd $BASEDIR    ls -1 | sort -u > $a    cd -    tot1=$(wc -l < $a)    echo "found $tot1 total"     printf "inspecting volumes used by existing containers ... "    for x in $(docker ps -qa | sed '1d');do        docker inspect -f '{{ .Volumes }}' ${x} | tr ' ' '\n' | cut -d':' -f2 | tr -d ']' | grep $BASEDIR >> $b    done    sed -i 's/\/var\/lib\/docker\/vfs\/dir\///g' $b    sort -u $b > $c    mv -f $c $b    tot2=$(wc -l < $b)    echo "found $tot2 total"     if [ "$tot1" -gt "$tot2" ];then        comm -3 $a $b > $c        tot3=$(wc -l < $c)        echo "purging $tot3 dangling volumes ... "        read -p "proceed? [y/n]" decision        if [ "$decision" = "y" ];then            while read d;do                printf "."                rm -rf ${BASEDIR}/$d            done < $c        else            echo "OK. Please examine this manually"            cat $c        fi    else        echo "nothing to purge"    fi    rm -f $a $b $c}

Fügen Sie einfach die Funktionsdeklaration 'volpurge ()' zu Ihrem Stammverzeichnis hinzu.bashrc-Datei. Diese Funktion muss als root ausgeführt werden.