ฉันจะลบภาพของ Docker ได้อย่างไร


265

ฉันมีภาพต่อไปนี้:

alex@alexvps:~$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
<none>              <none>              70c0e19168cf        5 days ago          1.069 GB
<none>              <none>              c2ce80b62174        8 days ago          399.2 MB
<none>              <none>              60afe4036d97        8 days ago          325.1 MB

และเมื่อฉันพยายามลบหนึ่งในนั้นฉันได้รับ:

alex@alexvps:~$ sudo docker rmi 60afe4036d97
Error: Conflict, 60afe4036d97 wasn't deleted
2014/01/28 00:54:00 Error: failed to remove one or more images

ฉันจะลบออกได้อย่างไร ทำไมถึงมีความขัดแย้งเช่นนี้?

คำตอบ:


478

เพื่อลบภาพทั้งหมดใช้คำสั่งที่กำหนด

docker rmi $(docker images -q)

เพื่อลบคอนเทนเนอร์ทั้งหมดใช้คำสั่งที่กำหนด

docker rm $(docker ps -a -q)

คำเตือน: สิ่งนี้จะทำลายรูปภาพและภาชนะทั้งหมดของคุณ จะไม่สามารถกู้คืนได้!

การแก้ปัญหานี้ให้บริการโดยTechoverflow.net


17
เรียบง่ายและตรง นอกจากนี้คุณด้านล่างคำสั่งเพื่อบังคับให้ลบภาพ 'นักเทียบท่า rmi -f $ (ภาพนักเทียบท่า -q)'
dimuthu

37
หน้าต่างที่ทรงพลังเทียบเท่าdocker images -q | %{docker rmi -f $_}
BeatingToADifferentRobot

1
ก่อนอื่นฉันใช้ cmd บน @muheed How to Answer ( stackoverflow.com/a/30475249/2747020 ) เพื่อปลดล็อกการลบภาพบางภาพ:sudo docker ps -a -q | xargs -n 1 -I {} sudo docker rm {}
Razec Luar

1
Windows Powershell สำหรับคอนเทนเนอร์นักเทียบท่าdocker ps -a -q | %{docker rm -f $_}
Dexter

1
ในฐานะ @ alexyz78 บันทึกด้านล่างคุณสามารถใช้งานdocker system pruneได้แล้ว ดังนั้นการล้าง everyhing: docker kill $(docker ps -q)เพื่อหยุดภาชนะตามด้วยdocker system prune -aจะลบทุกอย่าง - ดูstackoverflow.com/a/44309011/247708
Bharat

101

เหตุผลที่เป็นไปได้: สาเหตุที่เป็นไปได้ว่าปัจจุบันมีการใช้อิมเมจนี้โดยคอนเทนเนอร์ที่ใช้งานอยู่ ในกรณีเช่นนี้คุณสามารถแสดงรายการคอนเทนเนอร์ที่ใช้งานหยุดคอนเทนเนอร์ที่เกี่ยวข้องจากนั้นลบภาพ:

docker ps
docker stop <containerid>
docker rm <containerid>
docker rmi <imageid>

หากคุณไม่สามารถหาคอนเทนเนอร์โดยนักเทียบท่า ps คุณสามารถใช้สิ่งนี้เพื่อแสดงรายการคอนเทนเนอร์ที่ออกแล้วทั้งหมดแล้วลบออก

docker ps -a | grep 60afe4036d97
docker rm <containerid>

หมายเหตุ: โปรดระมัดระวังการลบคอนเทนเนอร์ที่ออกทั้งหมดพร้อมกันในกรณีที่คุณใช้Volume-Onlyคอนเทนเนอร์ เข้าพักเหล่านี้ในExitรัฐ แต่มีข้อมูลที่เป็นประโยชน์


ที่จริงแล้วคุณจะได้รับข้อความระบุว่า บางทีภาพอื่นจะขึ้นอยู่กับภาพนี้? ลองลบภาพใด ๆ ที่คุณสร้างจากภาพนี้ก่อน
qkrijger

12
ฉันสามารถลบภาพด้วยsudo docker ps -a | grep Exit | awk '{print $1}' | sudo xargs docker rm(ขอบคุณgithub.com/dotcloud/docker/issues/3258 ) และจากนั้นด้วยsudo docker rmi 70c0e19168cf
alexyz78

2
ระวังการลบภาพในExitสถานะ หากคุณใช้ภาชนะบรรจุข้อมูลเท่านั้นที่ไม่ได้ทำงานอยู่
aceofspades

1
awk can grep:awk '/Exit/ {print $1}'
Dwight Spencer

Error response from daemon: No such container: ...คำสั่งของคุณโยนนี้ เป็นการยากที่จะบอกว่าต้องเปลี่ยนอะไรและฉันควรแทนที่อะไร อย่าใช้...
Felo Vilches

60

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

docker rm `docker ps -aq --no-trunc --filter "status=exited"`

ตอนนี้สิ่งนี้จะลบ<none>รูปภาพที่ไม่ได้อยู่ในระดับกลางทั้งหมด:

docker rmi `docker images --filter 'dangling=true' -q --no-trunc`

หมายเหตุ: หากต้องการหยุดคอนเทนเนอร์ที่รันอยู่ทั้งหมด:

docker stop `docker ps -q`

1
ขอบคุณสำหรับสิ่งนี้ฉันพบว่านี่เป็นการใช้งานที่สะอาดที่สุด
Joseph Sawyer

7
ระวังถ้าคุณมีที่เก็บข้อมูลปริมาณเพราะพวกเขามี "สถานะ = ออก" ซึ่งหมายความว่าคุณจะสูญเสียข้อมูลทั้งหมดของคุณ
Johan

19

ปัจจุบันคอนเทนเนอร์สามารถใช้อิมเมจได้ดังนั้นคุณต้องหยุดและลบคอนเทนเนอร์ก่อน

docker stop <container-name>
docker rm <container-id>

จากนั้นคุณสามารถลองลบภาพ:

docker rmi <image-id>

คุณต้องแน่ใจว่าภาพนี้ไม่ได้ขึ้นอยู่กับภาพอื่น ๆ (ไม่เช่นนั้นคุณต้องลบออกก่อน)

ฉันมีกรณีแปลก ๆ ที่ฉันไม่มีตู้คอนเทนเนอร์อีกแล้วยังมีชีวิตอยู่ ( docker ps -aไม่มีอะไรคืน) แต่ฉันไม่สามารถลบภาพและการพึ่งพาภาพได้

ในการแก้กรณีพิเศษเหล่านี้คุณสามารถบังคับให้ลบภาพได้ด้วยวิธีนี้:

docker rmi -f <image-id>

19

ใน Bash:

for i in `sudo docker images|grep \<none\>|awk '{print $3}'`;do sudo docker rmi $i;done

จะเป็นการลบรูปภาพทั้งหมดที่มีชื่อ "<none>" ฉันพบว่าภาพเหล่านั้นซ้ำซ้อน


3
นี่ไม่ได้ตอบคำถาม แต่ก็ยังมีประโยชน์มาก ขอบคุณ
binwiederhier

5
ทำให้คำสั่งนี้ง่ายdocker images|grep \<none\>|awk '{print $3}' | xargs docker rmiก็อาจจะต้องsudoได้รับอนุญาต
ลาร์รี Cai

15

ฉันพบคำตอบในคำสั่งนี้:

docker images --no-trunc | grep none | awk '{print $3}' | xargs docker rmi

ฉันมีปัญหาของคุณเมื่อฉันลบภาพที่ใช้และฉันไม่ได้ตระหนักถึง (ใช้docker ps -a)


9

ตั้งแต่นักเทียบท่าเวอร์ชั่น 1.13.0 (มกราคม 2017) มีsystem pruneคำสั่ง:

$ docker system prune --help

Usage:  docker system prune [OPTIONS]

Remove unused data

Options:
-a, --all     Remove all unused images not just dangling ones
-f, --force   Do not prompt for confirmation
    --help    Print usage

7

นอกจากคำตอบของซันนี่:

ในการลบภาพทั้งหมดในเครื่อง Windows (ที่มี Docker สำหรับ Windows) ในหน้าต่าง PowerShell ให้ทำ:

docker images -q | %{docker rmi -f $_}

ในการลบคอนเทนเนอร์ทั้งหมดบนเครื่อง Windows (ที่มี Docker สำหรับ Windows) ในหน้าต่าง PowerShell ให้ทำ:

docker ps -a -q | %{docker rm -f $_}

6

ก่อนอื่นให้ลบคอนเทนเนอร์ทั้งหมดโดยใช้คำสั่งต่อไปนี้

sudo docker ps -a -q | xargs -n 1 -I {} sudo docker rm {}

จากนั้นลบภาพด้วย ID โดยใช้คำสั่งต่อไปนี้

sudo docker rmi <image-id>

เป็นที่น่าสังเกตว่าในกรณีที่บางคนไม่เห็นชัดเจนว่านี่จะลบคอนเทนเนอร์ที่ใช้งานนักเทียบท่าทั้งหมด
Michael Mior

4

คุณต้องหยุด / ลบคอนเทนเนอร์ที่ไม่จำเป็นทั้งหมดที่สร้างบนรูปภาพนั้นก่อน

มีรูปลักษณ์ที่: วิธีการเอาตู้คอนเทนเนอร์หางเก่า

หลังจากนั้นใช้ @marcell solution



4

เพียงแค่คุณสามารถเพิ่ม--forceที่ส่วนท้ายของคำสั่ง ชอบ:

sudo docker rmi <docker_image_id> --force

เพื่อให้ฉลาดขึ้นคุณสามารถเพิ่มเป็น:

sudo docker stop $(docker ps | grep <your_container_name> | awk '{print $1}')

sudo docker rm $(docker ps | grep <your_container_name> | awk '{print $1}')

sudo docker rmi $(docker images | grep <your_image_name> | awk '{print $3}') --force

ที่นี่ในdocker ps$ 1 เป็นคอลัมน์แรกเช่น ID คอนเทนเนอร์ของนักเทียบท่า

และdocker images$ 3 คือคอลัมน์ที่สามเช่น ID อิมเมจ Docker


3

คำสั่งเวอร์ชันย่อที่สุดที่จะลบอิมเมจที่ไม่ติดแท็กทั้งหมดคือ:

docker rmi $(docker images | grep "^<none>" | awk '{print $"3"}')

3

ในการลบอิมเมจ Docker บางตัวคุณต้องเรียกใช้คำสั่งต่อไปนี้:

$ docker rmi <docker_image_id>

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

$ docker rmi $(docker images -q)

ตอนนี้หากคุณต้องการลบภาพ Docker ทั้งหมด (รวมถึงภาพที่ใช้งานอยู่) คุณสามารถเพิ่มการตั้งค่าสถานะ-fได้เช่น:

$ docker rmi -f $(docker images -q)

3

ใช้

docker image prune -all

หรือ

docker image prune -a

ลบภาพที่ห้อยอยู่ทั้งหมด หาก-aมีการระบุจะเป็นการลบรูปภาพทั้งหมดที่ไม่ได้อ้างอิงโดยคอนเทนเนอร์ใด ๆ

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

ตามที่ระบุไว้ภายใต้เอกสารหางของลูกพรุน


1

หากคุณต้องการโดยอัตโนมัติ / meltwater/docker-cleanupระยะการทำความสะอาดภาชนะและภาพลบและปริมาณที่ไม่อยู่ในการใช้งานโดยภาชนะที่วิ่งออกคุณสามารถดาวน์โหลดภาพเทียบท่า

ด้วยวิธีนี้คุณไม่จำเป็นต้องไปทำความสะอาดด้วยมือ

เพิ่งรัน:

docker run -d -v /var/run/docker.sock:/var/run/docker.sock:rw  -v /var/lib/docker:/var/lib/docker:rw --restart=unless-stopped meltwater/docker-cleanup:latest

มันจะทำงานทุก ๆ 30 นาที (หรือนานกว่าที่คุณตั้งไว้โดยใช้ตัวเลือก DELAY_TIME = 1800) และล้างภาชนะและรูปภาพที่ออก

รายละเอียดเพิ่มเติม: https://github.com/meltwater/docker-cleanup/blob/master/README.md


0

ฉันได้พบวิธีแก้ปัญหาด้วยสคริปต์ Powershell ที่จะทำเพื่อฉัน

สคริปต์ในตอนแรกหยุดคอนเทนเนอร์ทั้งหมดกว่าลบคอนเทนเนอร์ทั้งหมดแล้วลบรูปภาพที่มีชื่อโดยผู้ใช้

ดูที่นี่http://www.devcode4.com/article/powershell-remove-docker-containers-and-images

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