เอกสารประกอบนักเทียบท่าอย่างเป็นทางการกล่าวถึงว่าฉันจำเป็นต้องเรียกใช้docker rm -v containername
เพื่อลบโวลุ่มข้อมูลโดยเฉพาะ แต่คุณจะทำอย่างไรถ้าคุณลบคอนเทนเนอร์ทั้งหมดที่อ้างอิงถึงโวลุ่มข้อมูลที่ระบุ?
เอกสารประกอบนักเทียบท่าอย่างเป็นทางการกล่าวถึงว่าฉันจำเป็นต้องเรียกใช้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
วนรอบคอนเทนเนอร์และรายการไดรฟ์
ยังดีกว่าคุณสามารถใช้สคริปต์ Python ที่นี่ข้อกำหนดเบื้องต้นคือการติดตั้งไคลเอนต์หลาม API สำหรับนักเทียบท่าpip install docker-py
| sed '1d'
? มันจะโยนผลแรกออกไป -q
ตัวเลือกในdocker ps -qa
แล้วได้รับการกำจัดของสายส่วนหัวในการส่งออก ฉันใช้นักเทียบท่ารุ่น 1.13 และมีฉันต้องใช้แทน{{ .Mounts }}
{{ .Volumes }}
ใน Docker 1.9 มีความสามารถในการจัดการปริมาณที่ดีขึ้นด้วยdocker volume
(ดู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
dangling=false
นั้นเหมือนกันทุกอย่างในลำดับที่ต่างกัน นักเทียบท่า 1.9.1 ฟังดูคาว ตัวกรองห้อยนั้นทำงานได้จริงหรือ อามันเป็นแมลง github.com/docker/docker/issues/16095 (ทำเครื่องหมายว่าปิด แต่ยังเป็นปัญหาสำหรับฉัน ... )
คำสั่งล้างข้อมูล: ตั้งแต่ Docker 1.13 แนะนำคำสั่งล้างข้อมูล ในการลบภาพภาชนะเครือข่ายและโวลุ่มที่ไม่ได้ใช้ทั้งหมด:
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
เพื่อล้างโวลุ่มห้อยจากนักเทียบท่า 1.9 ขึ้นไป
ฉันมีนักเทียบท่า 1.6
หลามรุ่นไม่ทำงานสำหรับฉันมันเป็นบ่นรุ่นนักเทียบท่าไม่ตรงกัน มันน่าทึ่งที่ในเวลาเช่นนี้ไม่มีอะไรจะดีไปกว่าการทำสิ่งต่าง ๆ
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 ของรูทของคุณ ฟังก์ชั่นนี้จะต้องเรียกใช้เป็นราก