ข้อผิดพลาดของนักเทียบท่าไม่สามารถลบคอนเทนเนอร์นักเทียบท่าความขัดแย้ง: ไม่สามารถลบการอ้างอิงที่เก็บได้


165

ฉันต้องการลบคอนเทนเนอร์ที่ Docker แต่เกิดข้อผิดพลาดเมื่อคุณต้องการลบ

ขั้นตอนต่อไปของฉันก่อนที่จะลบคอนเทนเนอร์ดูรายการของคอนเทนเนอร์ที่มีอยู่

sts@Yudi:~/docker$ sudo docker ps -as

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                    PORTS               NAMES                  SIZE
78479ffeba5c        ubuntu              "/bin/bash"         42 hours ago        Exited (0) 42 hours ago                       sharp_wescoff          81 B (virtual 187.7 MB)
0bd2b54678c7        training/webapp     "python app.py"     5 days ago          Exited (0) 5 days ago                         backstabbing_ritchie   0 B (virtual 323.7 MB)
0adbc74a3803        training/webapp     "python app.py"     5 days ago          Exited (143) 5 days ago                       drunk_feynman          0 B (virtual 323.7 MB)

หนึ่งฉันต้องการลบรายการคือ"training / webapp" แต่มีข้อผิดพลาดที่เกิดขึ้น

sts@Yudi:~/docker$ sudo docker rmi training/webapp
Error response from daemon: conflict: unable to remove repository reference "training/webapp" (must force) - container 0bd2b54678c7 is using its referenced image 54bb4e8718e8
Error: failed to remove images: [training/webapp]

ไม่ว่าจะเป็นภาชนะที่ทำงานในภาพหรือไม่

กรุณาช่วย


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

สรุปล่าสุดยอดเยี่ยมวิธีลบรูปภาพนักเทียบท่าภาชนะบรรจุและเล่มจาก Melissa Anderson Dec 2017 พร้อมตัวอย่างตัวกรองรูปแบบและอื่น ๆ
Webel IT Australia - upvoter

คำตอบ:


124

มีความแตกต่างระหว่างภาพนักเทียบท่าและภาชนะนักเทียบท่าคือ ตรวจสอบคำถาม SOนี้

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

docker ps -a               # Lists containers (and tells you which images they are spun from)
docker images              # Lists images  
docker rm <container_id>   # Removes a container

docker rmi <image_id>      # Removes an image 
                           # Will fail if there is a running instance of that image i.e. container

docker rmi -f <image_id>   # Forces removal of image even if it is referenced in multiple repositories, 
                           # i.e. same image id given multiple names/tags 
                           # Will still fail if there is a docker container referencing image

อัปเดตสำหรับ Docker 1.13+ [ตั้งแต่มกราคม 2017]

ใน Docker 1.13 เราจัดกลุ่มคำสั่งทุกคำสั่งเพื่อให้อยู่ภายใต้วัตถุลอจิคัลที่โต้ตอบกับมัน

โดยพื้นฐานแล้วคำสั่งข้างต้นสามารถเขียนใหม่ได้ชัดเจนยิ่งขึ้นเมื่อ:

docker container ls -a
docker image ls
docker container rm <container_id>
docker image rm <image_id>

นอกจากนี้หากคุณต้องการลบทุกอย่างคุณสามารถใช้:

docker system prune -a

คำเตือน! สิ่งนี้จะลบ:

  • ภาชนะที่หยุดทั้งหมด
  • เครือข่ายทั้งหมดที่ไม่ได้ใช้อย่างน้อยหนึ่งคอนเทนเนอร์
  • รูปภาพที่ไม่ได้ใช้ทั้งหมด
  • แคชบิลด์ทั้งหมด

3
ฉันต้องใช้docker rmi -f idเพื่อ "บังคับ" การลบ
WernerCD

@WernerCD -fช่วยเมื่อคุณต้องการลบภาพที่อ้างอิงในที่เก็บหลายแห่งซึ่งเป็นอีกสาเหตุหนึ่งที่ทำให้ภาพไม่สามารถลบได้
Ahmad Abdelghany

1
น่าสังเกตว่าdocker container lsมีเพียงรายการที่เรียกใช้คอนเทนเนอร์ สิ่งนี้ยุ่งกับฉันจนกว่าฉันจะรู้ว่าการเพิ่ม-aรายการจะแสดงรายการทั้งหมด
MFB

@MFB จุดดี เพิ่มแฟล็กเข้ากับคำสั่งเพื่อรักษาพาริตีระหว่างคำสั่งสองชุด ขอบคุณ!
Ahmad Abdelghany

ยังคงใช้งานได้บน OSX Docker Desktop v2.2.0.4 (เอ็นจิ้น 19.03.8)
rrrrrraul

83

ก่อนอื่นให้ลบชื่อคอนเทนเนอร์

$ sudo docker rm backstabbing_ritchie

ผลที่ได้

$ sudo docker rm backstabbing_ritchie
  backstabbing_ritchie

ลบส่วนที่สองซึ่งแสดงอยู่ในคอนเทนเนอร์ที่จะลบ

$ sudo docker rm drunk_feynman 
  drunk_feynman

ประการที่สองเอาภาชนะ

$ sudo docker rmi training/webapp

ผลที่ได้

$ sudo docker rmi training/webapp  
  Untagged: training/webapp:latest
  Deleted: 54bb4e8718e8600d78a5d7c62208c2f13c8caf0e4fe73d2bc0e474e93659c0b5
  Deleted: f74dd040041eb4c032d3025fe38ea85de8075992bdce6789b694a44b20feb8de
  Deleted: 7cbae69141977b99c44dc6957b032ad50c1379124d62b7d7d05ab7329b42348e
  Deleted: abb991a4ed5e4cde2d9964aec4cccbe0015ba9cc9838b696e7a32e1ddf4a49bd
  Deleted: 1952e3bf3d7e8e6a9b1e23bd4142e3c42ff7f4b7925122189704323593fd54ac
  Deleted: f95ebd363bf27a7546deced7a41a4099334e37a3d2901fa3817e62bb1ade183f
  Deleted: 20dd0c75901396d41a7b64d551ff04952084cc3947e66c67bae35759c80da338
  Deleted: 2505b734adda3720799dde5004302f5edb3f2a2ff71438f6488b530b728ba666
  Deleted: 2ee0b8f351f753f78f1178000ae37616eb5bf241d4ef041b612d58e1fd2aefdc
  Deleted: 2ce633e3e9c9bd9e8fe7ade5984d7656ec3fc3994f05a97d5490190ef95bce8d
  Deleted: 98b15185dba7f85308eb0e21196956bba653cf142b36dc08059b3468a01bf35d
  Deleted: 515565c29c940355ec886c992231c6019a6cffa17ff1d2abdfc844867c9080c5
  Deleted: 2880a3395eded9b748c94d27767e1e202f8d7cb06f1e40e18d1b1c77687aef77

ตรวจสอบทวีป

  $ sudo docker ps -as
  CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                    PORTS               NAMES                  SIZE
  78479ffeba5c        ubuntu              "/bin/bash"         43 hours ago        Exited (0) 43 hours ago                       sharp_wescoff          81 B (virtual 187.7 MB)

6
หากคุณมีคอนเทนเนอร์เก่าจำนวนมากคุณอาจพิจารณานักเทียบท่าrm `docker ps -aq`สำหรับการล้างข้อมูลแทนที่จะลบออกทีละรายการ ข้อมูลเพิ่มเติมได้ที่นี่
Philiiiiiipp

ทำไมจึงจำเป็นต้องลบชื่อก่อนที่จะลบภาพ? ทำไมต้องพยายามลบภาพที่ไม่มีการลบชื่อก่อนเป็นปัญหา?
code_dredd

@code_dredd ไม่มีสิ่งเช่น "การลบชื่อ" เป็นคอนเทนเนอร์ที่ต้องถูกลบก่อนก่อนที่จะลบรูปภาพ รายละเอียดเพิ่มเติมได้ที่stackoverflow.com/a/40283776/1998422
Ahmad Abdelghany

37

หากคุณต้องการล้างภาพและนักเทียบท่า

ข้อควรระวัง: สิ่งนี้จะล้างทุกอย่าง

หยุดภาชนะทั้งหมด

docker stop $(docker ps -a -q)

ลบภาชนะทั้งหมด

docker rm $(docker ps -a -q)

ลบภาพทั้งหมด

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

ที่ได้ผล นอกจากนี้หากคุณหยุดคอนเทนเนอร์คุณจะยังคงเห็นมันอยู่ในรายการ docker rm $(docker ps -a -q)ดังนั้นคุณจะต้องลบมันด้วย ขอบคุณ!

28

คุณสามารถใช้-fตัวเลือกเพื่อบังคับลบคอนเทนเนอร์

sudo docker rmi -f training/webapp

คุณสามารถหยุดการใช้ตู้คอนเทนเนอร์sudo docker stop training/webappก่อนที่จะลบ


1
ฉันได้ลองแล้วโดยการหยุดคอนเทนเนอร์ $ sudo docker stop training / webapp การตอบสนองข้อผิดพลาดจาก daemon: ไม่มี id ดังกล่าว: training / webapp Error: ไม่สามารถหยุดภาชนะ: [training / webapp]
Yuday

คุณสามารถลองหยุดด้วย ID ของตู้สินค้า sudo docker stop 0bd2b54678c7
Saril Sudhakaran

23

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

$ docker rm $(docker ps -aq)

มันจะลบนักเทียบท่าปัจจุบันทั้งหมดที่ระบุไว้ในคำสั่ง "ps -aq"

ที่มา: aaam บนhttps://github.com/docker/docker/issues/12487


สิ่งนี้ใช้ได้สำหรับฉัน หลังจากที่ฉันเรียกใช้คำสั่งนี้ฉันจะต้องเรียกใช้docker image lsแล้วdocker image rm Xที่แต่ละ X ได้รับจากlsผลลัพธ์
jftuga

5

สังเกตเห็นว่านี่เป็นคำถามอายุ 2 ปี แต่ยังต้องการแบ่งปันวิธีแก้ปัญหาสำหรับคำถามนี้:

ประการแรกเรียกใช้docker container ls -aเพื่อแสดงรายการคอนเทนเนอร์ทั้งหมดที่คุณมีและระบุความต้องการที่คุณต้องการลบ

ประการที่สองลบคำสั่งด้วยคำสั่งdocker container rm <CONTAINER ID>(หากคอนเทนเนอร์กำลังทำงานอยู่คุณควรหยุดก่อนเรียกใช้docker container stop <CONTAINER ID>เพื่อหยุดคอนเทนเนอร์ที่ระบุอย่างสง่างามหากไม่ได้หยุดมันด้วยเหตุผลใดก็ตามหรือคุณสามารถเรียกใช้docker container kill <CONTAINER ID> to force shutdown of the specified container) ประการที่สามเอาภาชนะโดยใช้

สุดท้ายคุณสามารถเรียกดูภาพทั้งหมดและลบที่คุณต้องการด้วยการวิ่งdocker container rm <CONTAINER ID>

docker image ls -adocker image rm <hash>


2

ลบภาพนักเทียบท่า>

แสดงรายการคอนเทนเนอร์ทั้งหมด

docker container ls

รายการภาพทั้งหมด

docker image ls

หยุดคอนเทนเนอร์ด้วย ID คอนเทนเนอร์

docker container stop <container_id>

ลบคอนเทนเนอร์ด้วย ID คอนเทนเนอร์

docker container rm <container_id>

หากไม่ต้องการหยุดและลบสามารถบังคับลบได้

docker container rm -f <container_id>

ลบภาพ

docker image rm <image_id>

ทำ!


2

รายการภาพนักเทียบท่าของคุณทั้งหมด:

docker images

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

docker ps -a

ลบคอนเทนเนอร์เป้าหมายทั้งหมดซึ่งใช้รูปภาพที่คุณต้องการลบ:

docker rm <container-id>

ลบภาพเป้าหมาย:

docker rmi <image-name:image-tag or image-id>

0

ลบเฉพาะคอนเทนเนอร์ที่เกี่ยวข้องกับรูปภาพเฉพาะ

docker ps -a | grep training/webapp | cut -d ' ' -f 1 | xargs docker rm
  • ps -a: แสดงรายการคอนเทนเนอร์ทั้งหมด
  • grep training / webapp: กรองทุกอย่างยกเว้นคอนเทนเนอร์ที่เริ่มต้นจากรูปภาพ training / webapp
  • cut -d '' -f 1: แสดงรายการรหัสตู้คอนเทนเนอร์เท่านั้น (ฟิลด์แรกเมื่อคั่นด้วยช่องว่าง)
  • xargs docker rm: ส่งเอาต์พุต list id container ไปยังคำสั่ง docker rm เพื่อลบคอนเทนเนอร์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.