นักเทียบท่ากำลังใช้งานโวลุ่ม แต่ไม่มีคอนเทนเนอร์ Docker ใด ๆ


166

ฉันมีปัญหากับการลบโวลุ่ม Docker ด้วย Docker 1.9.1

ฉันลบคอนเทนเนอร์ที่หยุดแล้วทั้งหมดของฉันแล้วจึงdocker ps -aส่งคืนว่างเปล่า

เมื่อฉันใช้docker volume lsฉันได้รับโฮสต์ทั้งหมดของคอนเทนเนอร์ Docker:

docker volume ls
DRIVER              VOLUME NAME
local               a94211ea91d66142886d72ec476ece477bb5d2e7e52a5d73b2f2f98f6efa6e66
local               4f673316d690ca2d41abbdc9bf980c7a3f8d67242d76562bbd44079f5f438317
local               eb6ab93effc4b90a2162e6fab6eeeb65bd0e4bd8a9290e1bad503d2a47aa8a78
local               91acb0f7644aec16d23a70f63f70027899017a884dab1f33ac8c4cf0dabe5f2c
local               4932e2fbad8f7e6246af96208d45a266eae11329f1adf176955f80ca2e874f69
local               68fd38fc78a8f02364a94934e9dd3b5d10e51de5b2546e7497eb21d6a1e7b750
local               7043a9642614dd6e9ca013cdf662451d2b3df6b1dddff97211a65ccf9f4c6d47
#etc x 50

docker volume rm $(docker volume ls -q)เนื่องจากไม่มีหนังสือเล่มนี้มีอะไรที่สำคัญฉันพยายามที่จะล้างไดรฟ์ทั้งหมดที่มี

ในกระบวนการส่วนใหญ่จะถูกลบออก แต่ฉันกลับ:

Error response from daemon: Conflict: volume is in use
Error response from daemon: Conflict: volume is in use
Error response from daemon: Conflict: volume is in use
Error response from daemon: Conflict: volume is in use
Error response from daemon: Conflict: volume is in use

สำหรับส่วนใหญ่ของพวกเขา ถ้าฉันไม่มีคอนเทนเนอร์ใด ๆ ที่มีอยู่ในตอนแรกจะใช้วอลุ่มเหล่านี้อย่างไร


7
นักเทียบท่าใช้การนับการอ้างอิงเพื่อตรวจสอบว่าโวลุ่มยังคงใช้งานอยู่หรือไม่ ทั้งหมดนี้ทำในหน่วยความจำ นี่อาจเป็นข้อผิดพลาดหรือสภาพการแข่งขันอย่างใดซึ่งส่งผลให้คอนเทนเนอร์ถูกลบออก แต่ตัวนับไม่ได้รับการปรับปรุง การรีสตาร์ท daemon ควรแก้ไขปัญหานี้ได้ แต่ใช่เป็นไปได้ว่ามีข้อผิดพลาดบางแห่ง มีบางสิ่งที่พิเศษในการตั้งค่าของคุณ (เช่นคุณใช้นักเทียบท่าใน Swarm หรือไม่?) คุณใช้สคริปต์หรือเครื่องมือในการล้างภาชนะของคุณหรือไม่?
thaJeztah

5
เฮ้ขอบคุณ @thaJeztah รีสตาร์ท Docker daemon ( sudo service docker stopและsudo service docker start) ลบข้อมูลทั้งหมดของผีฉันให้ฉัน ยิ่งไปกว่านั้นดูเหมือนว่าตอนนี้ฉันสามารถลบไดรฟ์โดยไม่มีปัญหาโดยใช้คำสั่ง docker rm -v ความแตกต่างที่โดดเด่นในการใช้งานคือฉันได้ใช้นักแต่งเพลงบน Ubuntu 15.10 ฉันจะรายงานกลับหากฉันสามารถทำซ้ำปัญหานี้ได้ แต่อย่างอื่นดูเหมือนว่าการรีสตาร์ทอย่างง่ายจะเพียงพอ ขอบคุณ!
Tkwon123

2
แม้หลังจากรีบูตก็ยังกล่าวว่าปริมาณนักเทียบท่าอยู่ในการใช้ ..
Holms

10
หากคุณใช้นักเทียบท่าเขียนคุณสามารถเพิ่ม -v ลงในคำสั่งลงเพื่อลบไดรฟ์
Niels Bech Nielsen

5
ฉันแก้ไขปัญหานี้ด้วยการหยุดนักเทียบท่าจากนั้นนำโวลุ่มออกจากระบบไฟล์และเริ่มต้นตัวเทียบท่าอีกครั้ง service docker stop && rm -rf /var/lib/docker/volumes/TheVolumIdYouWantToRemove && service docker start
jfgrissom

คำตอบ:


169

คุณสามารถใช้ฟังก์ชั่นเหล่านี้เพื่อลบทุกสิ่งที่เกี่ยวข้องกับ Docker:

removecontainers() {
    docker stop $(docker ps -aq)
    docker rm $(docker ps -aq)
}

armageddon() {
    removecontainers
    docker network prune -f
    docker rmi -f $(docker images --filter dangling=true -qa)
    docker volume rm $(docker volume ls --filter dangling=true -q)
    docker rmi -f $(docker images -qa)
}

คุณสามารถเพิ่มผู้ที่คุณ~/Xrcไฟล์ที่ X คือล่ามเปลือกของคุณ ( ~/.bashrcหากคุณใช้ทุบตี) source ~/Xrcและโหลดไฟล์พวกเขาผ่านการดำเนินการ นอกจากนี้คุณสามารถคัดลอกวางลงในคอนโซลและหลังจากนั้น (โดยไม่คำนึงถึงตัวเลือกที่คุณเคยทำก่อนเพื่อให้พร้อมใช้งาน) เพียงแค่เรียกใช้:

armageddon

นอกจากนี้ยังมีประโยชน์สำหรับนักเทียบท่าทั่วไปเท่านั้นที่ทำความสะอาด โปรดทราบว่าการดำเนินการนี้จะลบภาพของคุณออกไม่เพียง แต่คอนเทนเนอร์ของคุณ (ไม่ว่าจะรันหรือไม่ก็ตาม) และวอลลุ่มต่าง ๆ


3
ตามคำถามdocker volume rmคำสั่งนั้นล้มเหลว จากความคิดเห็นโซลูชันดูเหมือนจะรีสตาร์ท docker daemon เพื่อแก้ไขจำนวนการอ้างอิง
BMitch

2
@BMitch หากคุณอ่านอย่างระมัดระวังผ่านความคิดเห็นนั่นไม่ใช่วิธีแก้ปัญหาสำหรับเรื่องนี้:even after reboot it still says docker volume is in use..
David González Ruiz

1
ดูเหมือนว่าโฮล์มส์จะมีปัญหาที่แตกต่างออกไป ค้นหาหนึ่งความคิดเห็นข้างต้นที่
BMitch

10
อวัยวะเพศชาย, สำหรับชื่อฟังก์ชั่น แต่มันสะกดว่าarmageddon
Joseph Sheedy

1
นี่ไม่ได้แก้ปัญหาของฉัน ใช้docker-compose down --volumesไม่แม้ว่า (แนะนำโดย @ Robert K. เบลล์)
BiAiB

159

อาจจะสร้างวอลลุ่มด้วยdocker-compose? ถ้าเป็นเช่นนั้นควรลบโดย:

docker-compose down --volumes

ขอมอบเครดิตให้แก่Niels Bech Nielsen !


3
ใช้งานได้ :) มันเป็นเรื่องดีที่จะต้องทราบว่าสิ่งนี้จะลบคอนเทนเนอร์ทั้งหมดด้วย สิ่งนี้อาจไม่เป็นที่ต้องการหากคุณเปลี่ยนไฟล์ในคอนเทนเนอร์ที่ไม่ได้อยู่ในที่เมาท์ถาวรและไม่ใช่ในรูปภาพ
Alexander Varwijk

58

ฉันค่อนข้างใหม่สำหรับนักเทียบท่า ฉันกำลังล้างข้อมูลการทดสอบเริ่มต้นและไม่สามารถลบโวลุ่มได้ ฉันได้หยุดอินสแตนซ์ที่ทำงานอยู่ทั้งหมดดำเนินการ a docker rmi -f $(docker image ls -q)แต่ยังคงได้รับError response from daemon: unable to remove volume: remove uuid: volume is in useแต่ยังคงได้รับ

ฉันทำdocker system pruneและทำความสะอาดสิ่งที่จำเป็นในการลบโวลุ่มล่าสุด:

[0]$ docker system prune
WARNING! This will remove:
- all stopped containers
- all networks not used by at least one container
- all dangling images
- all build cache
Are you sure you want to continue? [y/N] y
Deleted Containers:
... about 15 containers UUID's truncated

Total reclaimed space: 2.273MB
[0]$ docker volume ls
DRIVER              VOLUME NAME
local              uuid
[0]$ docker volume rm uuid
uuid
[0]$

docker system prune

ไคลเอ็นต์และ daemon API ต้องมีอย่างน้อย 1.25 เพื่อใช้คำสั่งนี้ ใช้docker versionคำสั่งบนไคลเอ็นต์เพื่อตรวจสอบเวอร์ชันไคลเอ็นต์และ daemon API ของคุณ


ด้วยเหตุผลบางอย่างฉันต้องทำสองครั้งก่อนที่มันจะทำงาน
mameluc

1
ฉันต้องทำ "การตัดระบบนักเทียบท่า" จากนั้น "ปริมาตรตัวเชื่อมต่อ rm volume_name" ด้วยเหตุผลบางอย่างลูกพรุนลบคอนเทนเนอร์ที่ฉันลบไปแล้ว สับสน
Matthew Rideout

54

ปริมาตรสามารถใช้งานได้โดยหนึ่งในคอนเทนเนอร์ที่หยุดทำงาน คุณสามารถลบคอนเทนเนอร์ดังกล่าวโดยคำสั่ง:

docker container prune

จากนั้นคุณสามารถลบไดรฟ์ที่ไม่ได้ใช้

docker volume prune

1
นี่ควรเป็นคำตอบที่ยอมรับไม่ได้ว่าทำไมคนถึงชอบคำตอบที่ได้รับ
Elger Mensonides

9

ตราบใดที่ปริมาณเชื่อมโยงกับคอนเทนเนอร์ (ไม่ว่าจะรันหรือไม่ก็ตาม) จะไม่สามารถลบออกได้

คุณต้องวิ่ง

docker inspect <container-id>/<container-name>

บนแต่ละคอนเทนเนอร์ที่รัน / ไม่ทำงานซึ่งไดรฟ์ข้อมูลนี้อาจติดตั้งไว้

หากไดรฟ์ข้อมูลถูกติดตั้งลงในคอนเทนเนอร์ใด ๆ คุณควรเห็นมันในส่วน Mounts ของเอาต์พุตคำสั่งตรวจสอบ บางสิ่งเช่นนี้: -

"Mounts": [
            {
                "Type": "volume",
                "Name": "user1",
                "Source": "/var/lib/docker/volumes/user1/_data",
                "Destination": "/opt",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],

หลังจากหาภาชนะที่รับผิดชอบแล้วให้ใช้: -

docker rm -f container-1 container-2 ...container-n ในกรณีที่ใช้ภาชนะบรรจุ

docker rm container-1 container-2 ...container-n ในกรณีของภาชนะที่ไม่ได้ทำงาน

เพื่อลบคอนเทนเนอร์ออกจากเครื่องโฮสต์อย่างสมบูรณ์

จากนั้นลองลบโวลุ่มโดยใช้คำสั่ง: -

docker volume remove <volume-name/volume-id>


1
สำหรับคำตอบที่มีประโยชน์ปฏิกิริยานี้จะต้องมีการขยาย เพิ่มข้อมูลเกี่ยวกับวิธีตรวจสอบสิ่งนี้
Jeroen Heier

1
ฉันเดิมพันdocker container pruneต้องเพียงพอในกรณีส่วนใหญ่
x-yuri

6

ขณะนี้คุณสามารถใช้สิ่งที่นักเทียบท่านำเสนอตอนนี้เพื่อทำความสะอาดทั่วไปและสมบูรณ์มากขึ้น:

docker system prune

หากต้องการลบคอนเทนเนอร์ที่หยุดทำงานใด ๆ และอิมเมจที่ไม่ได้ใช้ทั้งหมด (ไม่ใช่แค่อิมเมจ dangling) ให้เพิ่ม-aแฟล็กในคำสั่ง:

docker system prune -a

3

ฉันค่อนข้างมั่นใจว่าไดรฟ์ข้อมูลเหล่านั้นติดตั้งบนระบบของคุณจริง ดูใน / proc / mounts แล้วคุณจะเห็นตรงนั้น คุณอาจจะต้องหรือsudo umount <path> sudo umount -f -n <path>คุณควรจะสามารถรับพา ธ ที่เมาท์ได้ทั้งใน / proc / mounts หรือผ่านdocker volume inspect


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.