Removendo volumes de dados do Docker?

A documentação oficial do Docker menciona que preciso executar docker rm -v containername para remover especificamente um volume de dados. Mas o que você faz se você já removeu todos os contêineres que fazem referência ao volume de dados específico ?

No Docker 1.9, há a capacidade de gerenciar volumes melhor com docker volume (ver este PR):

$ docker --versionDocker version 1.9.0, build 76d6bc9$ docker volumeUsage:  docker volume [OPTIONS] [COMMAND]Manage Docker volumesCommands:  create                   Create a volume  inspect                  Return low-level information on a volume  ls                       List volumes  rm                       Remove a volumeRun 'docker volume COMMAND --help' for more information on a command  --help=false       Print usage$ docker volume ls -f dangling=trueDRIVER              VOLUME NAMElocal               0490a79a769b8fc96b901ad2b92be9f34516476be5d06da766b4fd8636275330local               sourcelocal               89ecc5c7afc0c004b2eccff55692b842b4394ba12048195b385334ec7b161857local               382a7ea81dd87f773914725d755ffe28110c3f07da5f135d6181bf55b393070alocal               0eef9492e7bf3f4e62fd1195b7284b32dd6f22ac8c99052f6ccf890c3d7a4e3clocal               499d1da8e35ebd51a2217c2ca68272740a6ae85a3d2e29e9abf54163d12f5c56local               da1cb72a3a39991b11992a8d5dbc3167771fb54b8eb41308657151ba934b981flocal               4530c88973639c6a4d6c35e9ee4a0ec48dcdd5767fa377214b4a32644ecb8947local               784d941d6e1c7a89a064f9bbe3f594520174029efcbb792b3285915653801f0flocal               0250901593eecd6321a937fe321e5f88996716035ae51fa60952dcc1c5b8f884local               92aa72c8a82facc0164f88b7216b2699dd4d393f7364ba5b8fd92e217c305d7elocal               b88b70a407cd97cd5dfd0d93860ea620293abfe9090d2237cb88363846bfe8d3local               5206cdf191052df750f6b37e37ce55455a03f6afcc6bfb03c46c8d1c87d5791flocal               88c510defbfc90a98026a88cca556725e60a15ac2ab579084664fa03b529670dlocal               d2538cf892e0f75f37e458e6240b7e31600f93d1fb40eb0190eba669f81e3b12local               e3d3cad4f814edd582b0dad2bfe069f9c69d9cc60b71e32a56690295269cac6elocal               120f36311a4f27497b7b89f22b1e0b7ace2c5e72f23cc1b869c895c37b4ed2dblocal               42b8c7587137d493aac0388487ba745b077d27fb4f05f1d3f892246fef9f82f1local               53dba9646ab87392c5c82768efb6b72a51de26564f0db2cacb790a3dccf846d2

Estes podem ser removidos através deste comando:

$ docker volume rm $(docker volume ls -qf dangling=true)42b8c7587137d493aac0388487ba745b077d27fb4f05f1d3f892246fef9f82f153dba9646ab87392c5c82768efb6b72a51de26564f0db2cacb790a3dccf846d25206cdf191052df750f6b37e37ce55455a03f6afcc6bfb03c46c8d1c87d5791f88c510defbfc90a98026a88cca556725e60a15ac2ab579084664fa03b529670dd2538cf892e0f75f37e458e6240b7e31600f93d1fb40eb0190eba669f81e3b12e3d3cad4f814edd582b0dad2bfe069f9c69d9cc60b71e32a56690295269cac6e120f36311a4f27497b7b89f22b1e0b7ace2c5e72f23cc1b869c895c37b4ed2db0eef9492e7bf3f4e62fd1195b7284b32dd6f22ac8c99052f6ccf890c3d7a4e3c0490a79a769b8fc96b901ad2b92be9f34516476be5d06da766b4fd8636275330source89ecc5c7afc0c004b2eccff55692b842b4394ba12048195b385334ec7b161857382a7ea81dd87f773914725d755ffe28110c3f07da5f135d6181bf55b393070a499d1da8e35ebd51a2217c2ca68272740a6ae85a3d2e29e9abf54163d12f5c56da1cb72a3a39991b11992a8d5dbc3167771fb54b8eb41308657151ba934b981f4530c88973639c6a4d6c35e9ee4a0ec48dcdd5767fa377214b4a32644ecb8947784d941d6e1c7a89a064f9bbe3f594520174029efcbb792b3285915653801f0f0250901593eecd6321a937fe321e5f88996716035ae51fa60952dcc1c5b8f88492aa72c8a82facc0164f88b7216b2699dd4d393f7364ba5b8fd92e217c305d7eb88b70a407cd97cd5dfd0d93860ea620293abfe9090d2237cb88363846bfe8d3$ docker volume ls -f dangling=trueDRIVER              VOLUME NAME

Antes da versão 1.9, o Docker não fornecia nenhuma maneira de remover volumes pendentes.

Se esses volumes estiverem ocupando muito espaço em disco e você quiser resolver o problema com suas próprias mãos, você pode excluir manualmente os volumes identificando primeiro os que estão em uso. Você pode correr docker inspect -f '{{ .Volumes }}' containername para encontrar o local no sistema de arquivos dos volumes em uso e, em seguida, excluir tudo, exceto aqueles. Se você tiver muitos contêineres, poderá executar for x in $(docker ps -qa | sed '1d'); do docker inspect -f '{{ .Volumes }}' ${x}; done para percorrer os contêineres e listar os volumes.

Melhor ainda, você pode usar o script Python aqui, o pré-requisito é instalar o cliente de API python para Docker pip install docker-py

Comandos de limpeza: a partir do docker 1.13 introduz comandos de limpeza. Para remover todos os contêineres, imagens, redes e volumes não utilizados:

docker system prune

ou individualmente:

docker container prune

docker image prune

docker network prune

docker volume prune

Use o comando

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

para limpar os volumes pendentes do docker 1.9 e superior.

Tenho o docker 1.6.

A versão python não funcionou para mim estava reclamando da incompatibilidade da versão do docker. É incrível, que em tempos como este, nada supera a boa e velha maneira de fazer as coisas.

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}

Basta adicionar a declaração de função' volpurge () ' à sua raiz .arquivo bashrc. Esta função deve ser executada como root.