删除Docker数据卷?

官方的Docker文档提到我需要运行docker rm -v containername来专门删除一个数据卷。 但是,如果您已经删除了引用特定数据量的所有容器,那么该怎么办?

    在版本1.9之前,Docker没有提供任何方法来移除悬挂的卷。

    如果这些卷占用了太多的磁盘空间,并且想要自行处理,则可以通过首先识别正在使用的卷来手动删除这些卷。 您可以运行docker inspect -f '{{ .Volumes }}' containername来查找正在使用的卷的文件系统中的位置,然后删除除这些之外的所有内容。 如果你有很多的容器,你可以for x in $(docker ps -qa | sed '1d'); do docker inspect -f '{{ .Volumes }}' ${x}; done运行for x in $(docker ps -qa | sed '1d'); do docker inspect -f '{{ .Volumes }}' ${x}; done for x in $(docker ps -qa | sed '1d'); do docker inspect -f '{{ .Volumes }}' ${x}; done for x in $(docker ps -qa | sed '1d'); do docker inspect -f '{{ .Volumes }}' ${x}; done以遍历容器并列出卷。

    更好的是,您可以在这里使用Python脚本,先决条件是为Docker pip install docker-py python API客户端pip install docker-py

    在Docker 1.9中,可以使用Docker卷更好地pipe理卷(请参阅此PR ):

     $ docker --version Docker version 1.9.0, build 76d6bc9 $ docker volume Usage: docker volume [OPTIONS] [COMMAND] Manage Docker volumes Commands: create Create a volume inspect Return low-level information on a volume ls List volumes rm Remove a volume Run 'docker volume COMMAND --help' for more information on a command --help=false Print usage $ docker volume ls -f dangling=true DRIVER VOLUME NAME local 0490a79a769b8fc96b901ad2b92be9f34516476be5d06da766b4fd8636275330 local source local 89ecc5c7afc0c004b2eccff55692b842b4394ba12048195b385334ec7b161857 local 382a7ea81dd87f773914725d755ffe28110c3f07da5f135d6181bf55b393070a local 0eef9492e7bf3f4e62fd1195b7284b32dd6f22ac8c99052f6ccf890c3d7a4e3c local 499d1da8e35ebd51a2217c2ca68272740a6ae85a3d2e29e9abf54163d12f5c56 local da1cb72a3a39991b11992a8d5dbc3167771fb54b8eb41308657151ba934b981f local 4530c88973639c6a4d6c35e9ee4a0ec48dcdd5767fa377214b4a32644ecb8947 local 784d941d6e1c7a89a064f9bbe3f594520174029efcbb792b3285915653801f0f local 0250901593eecd6321a937fe321e5f88996716035ae51fa60952dcc1c5b8f884 local 92aa72c8a82facc0164f88b7216b2699dd4d393f7364ba5b8fd92e217c305d7e local b88b70a407cd97cd5dfd0d93860ea620293abfe9090d2237cb88363846bfe8d3 local 5206cdf191052df750f6b37e37ce55455a03f6afcc6bfb03c46c8d1c87d5791f local 88c510defbfc90a98026a88cca556725e60a15ac2ab579084664fa03b529670d local d2538cf892e0f75f37e458e6240b7e31600f93d1fb40eb0190eba669f81e3b12 local e3d3cad4f814edd582b0dad2bfe069f9c69d9cc60b71e32a56690295269cac6e local 120f36311a4f27497b7b89f22b1e0b7ace2c5e72f23cc1b869c895c37b4ed2db local 42b8c7587137d493aac0388487ba745b077d27fb4f05f1d3f892246fef9f82f1 local 53dba9646ab87392c5c82768efb6b72a51de26564f0db2cacb790a3dccf846d2 

    这些可以通过这个命令删除:

     $ docker volume rm $(docker volume ls -qf dangling=true) 42b8c7587137d493aac0388487ba745b077d27fb4f05f1d3f892246fef9f82f1 53dba9646ab87392c5c82768efb6b72a51de26564f0db2cacb790a3dccf846d2 5206cdf191052df750f6b37e37ce55455a03f6afcc6bfb03c46c8d1c87d5791f 88c510defbfc90a98026a88cca556725e60a15ac2ab579084664fa03b529670d d2538cf892e0f75f37e458e6240b7e31600f93d1fb40eb0190eba669f81e3b12 e3d3cad4f814edd582b0dad2bfe069f9c69d9cc60b71e32a56690295269cac6e 120f36311a4f27497b7b89f22b1e0b7ace2c5e72f23cc1b869c895c37b4ed2db 0eef9492e7bf3f4e62fd1195b7284b32dd6f22ac8c99052f6ccf890c3d7a4e3c 0490a79a769b8fc96b901ad2b92be9f34516476be5d06da766b4fd8636275330 source 89ecc5c7afc0c004b2eccff55692b842b4394ba12048195b385334ec7b161857 382a7ea81dd87f773914725d755ffe28110c3f07da5f135d6181bf55b393070a 499d1da8e35ebd51a2217c2ca68272740a6ae85a3d2e29e9abf54163d12f5c56 da1cb72a3a39991b11992a8d5dbc3167771fb54b8eb41308657151ba934b981f 4530c88973639c6a4d6c35e9ee4a0ec48dcdd5767fa377214b4a32644ecb8947 784d941d6e1c7a89a064f9bbe3f594520174029efcbb792b3285915653801f0f 0250901593eecd6321a937fe321e5f88996716035ae51fa60952dcc1c5b8f884 92aa72c8a82facc0164f88b7216b2699dd4d393f7364ba5b8fd92e217c305d7e b88b70a407cd97cd5dfd0d93860ea620293abfe9090d2237cb88363846bfe8d3 $ docker volume ls -f dangling=true DRIVER VOLUME NAME 

    清理命令:自docker 1.13开始引入清理命令。 删除所有未使用的容器,图像,networking和卷:

    docker system prune

    或单独:

    docker container prune

    docker image prune

    docker network prune

    docker volume prune

    使用命令

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

    从docker1.9和以上清除悬挂卷。

    我有docker 1.6。

    python版本没有为我工作,它抱怨docker版本不匹配。 这真是太神奇了,在这样的时代,没有什么能比老式的做事方式更胜一筹。

     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 } 

    只需将“volpurge()”函数声明添加到根的.bashrc文件中即可。 这个函数必须以root身份运行。