รูปภาพห้อยคืออะไรและรูปภาพที่ไม่ได้ใช้คืออะไร


155

ในเอกสารนักเทียบท่าของภาพอิมเมจนักเทียบท่ามันเป็นไปได้ที่จะใช้แฟล็ก -a

ลบภาพที่ไม่ได้ใช้ทั้งหมดออก

และหลังจากนั้น

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

บางคนสามารถอธิบายให้ฉันทราบได้ว่าภาพที่ห้อยอยู่นั้นคืออะไรและอะไรคือความแตกต่างระหว่างภาพที่ห้อยและไม่ได้ใช้


ลูกพรุนภาพนักเทียบท่า (ไม่ -a) ไม่ตรงแม้ว่าเดียวกัน
Herm

มันล้มเหลวเมื่อคุณใช้สิ่งนั้นในเจนกินส์เราจะสูญเสียการสำรองข้อมูลนักเทียบท่าในการผลิตหากเราขึ้นอยู่กับแคชอิมเมจของนักเทียบท่า pruneไม่ได้รับการแนะนำในการผลิต /
Jinna Balu

คำตอบ:


153

รูปภาพที่ไม่ได้ใช้หมายความว่ายังไม่ได้กำหนดหรือใช้ในภาชนะ ตัวอย่างเช่นเมื่อทำงานdocker ps -a- มันจะแสดงรายการคอนเทนเนอร์ที่ออกและที่กำลังทำงานอยู่ทั้งหมดของคุณ ภาพใด ๆ ที่แสดงการใช้งานภายในภาชนะบรรจุใด ๆ เป็น "ภาพที่ใช้แล้ว"

ในทางกลับกันรูปภาพห้อยต่องๆนั้นหมายความว่าคุณได้สร้างภาพใหม่ขึ้นมา แต่มันไม่ได้ตั้งชื่อใหม่ ภาพเก่า ๆ ที่คุณได้กลายเป็น "รูปห้อย" บรรดาภาพเก่าเป็นคนที่มีแท็กและการแสดง " <none>" docker imagesในชื่อของมันเมื่อคุณเรียกใช้

เมื่อทำงานdocker system prune -aจะลบทั้งภาพที่ไม่ได้ใช้และที่ห้อยอยู่ ดังนั้นรูปภาพใด ๆ ที่ใช้ในคอนเทนเนอร์ไม่ว่าจะถูกออกหรือทำงานอยู่ในปัจจุบันจะไม่ได้รับผลกระทบ


ตามเอกสารประกอบเมื่อเรียกใช้ตัวตัดนักเทียบท่าที่ไม่มี -a ภาพที่ห้อยอยู่เท่านั้นจะถูกลบออก - จะให้แน่ใจว่าภาพที่ไม่ได้ใช้จะถูกลบด้วยหรือไม่ docs.docker.com/engine/reference/commandline/system_prune
herm


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

7
docker system prune --all --filter "until=24h"เก็บรักษารูปภาพล่าสุดด้วย
แฮร์รี่โมเรโน

1
ตามdocs.docker.com/engine/reference/commandline/system_prune/ … docker system prune -aก็ลบคอนเทนเนอร์ที่หยุดทำงานด้วย ดังนั้นควรลบภาพที่เกี่ยวข้องกับคอนเทนเนอร์ที่ออกแล้วด้วยใช่ไหม
lfk

41

วิธีที่ปลอดภัยและง่ายที่สุดในการล้างรูปภาพที่เป็นอันตราย

docker images --quiet --filter=dangling=true | xargs --no-run-if-empty docker rmi

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

หมายเหตุ: ฉันไม่แนะนำให้ใช้pruneในการผลิตเพราะdocker system prune -aจะลบรูปภาพทั้งหมดที่ไม่ได้อ้างอิงโดยคอนเทนเนอร์ซึ่งเราไม่สามารถย้อนกลับไปยังรีลีสก่อนหน้าได้

การแสดงรายชื่อห้อยภาพโดยการเพิ่มธงกรอง-fที่มีค่าของไปdangling=truedocker images

รายการภาพที่ห้อยอยู่

docker images -f dangling=true

ลบรูปภาพที่ห้อยอยู่

docker rmi $(docker images -f dangling=true -q)

หรือ

docker images --quiet --filter=dangling=true | xargs --no-run-if-empty docker rmi

เมื่อเรารันงาน cron ใด ๆ เพื่อลบสิ่งที่ห้อยต่องแต่งใช้ข้างต้นเพื่อให้แน่ใจว่างานทำงานได้สำเร็จ เช่นเดียวกับใน Jenkins ถ้าเราใช้งานรูปแบบฟรีกับงานด้านล่างคอมมอนจะไม่ล้มเหลวแม้ว่าจะไม่มีสิ่งที่ห้อยอยู่ในเครื่อง

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


2
สิ่งที่เกี่ยวกับนักเทียบท่ารูปภาพพรุน? เอกสารพูดว่า: "ลบภาพที่ห้อยอยู่ทั้งหมดหากระบุ -a ไว้จะเป็นการลบภาพทั้งหมดที่ไม่ได้อ้างอิงโดยที่เก็บข้อมูลใด ๆ " docs.docker.com/engine/reference/commandline/image_prune/…
herm

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

รูปภาพที่มีชื่อและแท็กที่ไม่มีในdocker imagesนั้นห้อยอยู่ วิธีการตรวจสอบขนาดของพวกเขา? นอกจากนี้รูปภาพที่มีชื่อและแท็กเป็นไม่มีในdocker images -aนั้นเป็นรูปภาพระดับกลาง พวกเขาจะถูกลบและวิธีการตรวจสอบขนาดของพวกเขา?
ตัวแปร

17

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

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

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


ในขณะที่ build docker กำลังทำงาน (กระบวนการที่สร้างเลเยอร์และตัวเลือกที่เป็นไปได้สำหรับรูปภาพ dangling ในอนาคต) ในหน้าต่างใหม่ถ้าฉันเรียกใช้พรุนอิมเมจพรุนแล้วมันจะส่งผลกระทบต่อการสร้างความคืบหน้าในทางใด?
ตัวแปร

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

รูปภาพที่เป็นสื่อกลาง (ภาพที่ไม่มีชื่อ / แท็กที่แสดงขณะทำงานdocker images -a) หรือที่เรียกว่าภาพที่ห้อยอยู่หรือไม่? พวกเขาได้รับการล้างด้วยลูกพรุนภาพนักเทียบท่า?
ตัวแปร

ฉันไม่ได้มีสิ่งเหล่านี้ในสภาพแวดล้อมของฉันอีกต่อไป (โดยใช้ buildkit ที่นี่) ดังนั้นฉันขอแนะนำให้ลองใช้ตัวคุณเองในห้องทดลองเพื่อดูว่าเกิดอะไรขึ้น
BMitch

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

5

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

รูปภาพที่ไม่ได้ใช้เป็นรูปภาพที่ไม่ได้รับการกำหนดหรือใช้ในภาชนะ

รายการภาพที่ห้อยอยู่

docker images -f dangling=true

3

รูปภาพห้อยต่องแต่งเป็นภาพที่ไม่ได้ติดแท็ก คำสั่งดังต่อไปนี้ให้รายการรูปภาพที่ห้อยอยู่

docker images --filter "dangling=true"

docker image prune ลบภาพที่ห้อยอยู่ทั้งหมด

รูปภาพที่ไม่ได้ใช้เป็นรูปภาพที่มีแท็ก แต่ไม่ได้ใช้เป็นคอนเทนเนอร์ คุณอาจต้องการหรือไม่จำเป็นในอนาคต

docker image prune -a ลบ dangling ทั้งหมดรวมถึงรูปภาพที่ไม่ได้ใช้

โดยทั่วไปคุณไม่ต้องการลบภาพที่ไม่ได้ใช้ทั้งหมดจนกว่าจะถึงเวลา ดังนั้นจึงเป็นการดีกว่าที่จะลบด้วยตัวกรอง

docker image prune -f --filter "until=6h"


1) docker image prune -a -f --filter "until=6h"ลบภาพที่ห้อยอยู่หรือไม่?
ตัวแปร

2) ในคำสั่งสุดท้ายของคุณคุณพูดถึงdocker image prune -f --filter "until=6h"- เนื่องจากไม่มี -a - แล้วทำไมมันจะลบภาพที่ไม่ได้ใช้?
ตัวแปร

0

ฉันเห็นคำสั่งที่เป็นประโยชน์ (นามแฝง) สำหรับการลบภาพห้อยความอนุเคราะห์ของ andyneff ที่นี่: https://forums.docker.com/t/how-to-delete-cache/5753 :

alias docker_clean_images='docker rmi $(docker images -a --filter=dangling=true -q)' 
alias docker_clean_ps='docker rm $(docker ps --filter=status=exited --filter=status=created -q)' 

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

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

docker kill $(docker ps -q) docker_clean_ps docker rmi $(docker images
-a -q)

สิ่งนี้จะฆ่าและลบภาพทั้งหมดในแคชของคุณ


0

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

docker system prune -aมันจะลบทั้งภาพที่ไม่ได้ใช้และที่ห้อยอยู่ ดังนั้นรูปภาพใด ๆ ที่ใช้ในคอนเทนเนอร์ไม่ว่าจะถูกออกหรือทำงานอยู่ในปัจจุบันจะไม่ได้รับผลกระทบ

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