จะลบภาพนักเทียบท่าตามชื่อได้อย่างไร?


94

ฉันต้องการลบอิมเมจนักเทียบท่าทุกเวอร์ชันที่มีชื่อที่มีสตริงที่กำหนด ( imagename)
ฉันได้ลองด้านล่างแล้ว แต่ดูเหมือนจะไม่ได้ผล:

docker images | grep 'imagename' | xargs -I {} docker rmi

คำตอบ:


136

ลองทำดังต่อไปนี้:

docker rmi $(docker images |grep 'imagename')

Windows Powershell:

docker rmi $(docker images --format "{{.Repository}}:{{.Tag}}"|findstr "imagename")

17
Docker เวอร์ชันปัจจุบันรองรับสิ่งนี้ (ไม่มี grep): docker rmi $ ('Imagename' ของภาพนักเทียบท่า)
Charlie

ดูเหมือนว่า Docker เวอร์ชันปัจจุบันจะรองรับสิ่งนี้บางทีฉันอาจพลาดอะไรไป - นักเทียบท่า rmi 'Imagename'
Charlie

10
@ ชาร์ลีฉันคิดว่าคนส่วนใหญ่กำลังมองหาวิธีที่จะจับคู่ภาพทั้งหมดที่ตรงกับ 'ชื่อจินตนาการ ' มากกว่าภาพเดียวที่มีชื่อว่า 'ชื่อจินตนาการ'
RJFalconer

1
ฉันได้รับข้อผิดพลาดต่อไปนี้: "docker rmi ต้องการอาร์กิวเมนต์อย่างน้อย 1 รายการ"
michali

@michali หมายความว่าไม่มีการส่งคืนรูปภาพที่ตรงกันคุณสามารถตรวจสอบได้หรือไม่ว่ามีรายการที่ตรงกันอยู่โดยเพียงแค่เรียกใช้:docker images |grep 'imagename'
Rambler

73

เวอร์ชันที่แน่นอนกว่าเล็กน้อย - grepping เฉพาะในชื่อที่เก็บ:

docker rmi $(docker images --format '{{.Repository}}:{{.Tag}}' | grep 'imagename')

25
สิ่งนี้จะลบเฉพาะภาพที่ติดแท็กล่าสุดdocker rmi $(docker images --format '{{.Repository}}:{{.Tag}}' | grep 'imagename')
Drew

ขอบคุณ! นี่คือสิ่งที่ฉันกำลังมองหา
Hardhik

26
docker rmi $(docker images --format '{{.Repository}}:{{.Tag}}' | grep 'imagename')

1
คุณอธิบายได้ไหมว่าสิ่งนี้ทำอะไร? รหัสสุ่มบิตอาจเป็นอันตรายได้
กิโลจูล

6
docker images --format '{{.Repository}}:{{.Tag}}กรองผลลัพธ์เพื่อให้แสดงเฉพาะ repo & tag เท่านั้น (เช่นfoo:latest) กรองเส้นที่ให้กับภาพเหล่านั้นเท่านั้นที่มีgrep 'imagename imagenameการใส่สิ่งนั้นในการ$()ประเมินสิ่งนั้นและส่งผ่านไปยังด้านนอกdocker rmiซึ่งจะลบภาพเหล่านั้นที่ตรงกัน
Adam Parkin

เมื่อขยายด้านบนคุณสามารถลบภาพที่ติดแท็กทั้งหมดที่ตรงกับชื่อภาพที่แน่นอนได้ดังนี้docker rmi -f $(docker images --format '{{.Repository}}:{{.Tag}}' --filter=reference='imagename:*')'
timmins

1
บน windows ไม่มี "grep" (cmd หรือ powershell) สิ่งต่อไปนี้สามารถใช้ได้กับแม่ม่ายdocker rmi $( docker images --format '{{.Repository}}:{{.Tag}}' | Select-String -Pattern 'imagename')
Zameer Fouzan

20

docker imagesใช้อาร์กิวเมนต์ตำแหน่งแรกเป็นชื่อรูปภาพเพื่อกรอง ไม่จำเป็นต้องใช้ grep และ awk ตัวเลือกที่จะกลับมาเพียงรหัสภาพจับคู่ซึ่งสามารถนำไปใช้เลี้ยง-qdocker rmi

docker rmi --force $(docker images -q 'imagename' | uniq)

uniqจะต้องลบรายการที่ซ้ำในกรณีที่คุณมีภาพเดียวกันที่ติดแท็กที่แตกต่างกัน


นี่เป็นตัวเลือกที่ดีที่สุดในปัจจุบัน เพื่อให้สอดคล้องกับคำถามแม้ว่าชื่อภาพควรอยู่ในเครื่องหมายคำพูด
Colm Bhandal

8

เพียงแค่คุณเพิ่ม--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เป็น 1 คอลัมน์เช่นนักเทียบท่าภาชนะ ID และ$ 3เป็น 3 คอลัมน์เช่นนักเทียบท่าภาพประจำตัวประชาชน


5

ฉันพบว่าคำตอบของฉันง่ายขึ้น

python_imageตัวอย่างเช่นชื่อภาพของคุณคือ

จากนั้นรหัสของคุณควรเป็น :

docker rmi $(docker images --filter=reference='python_image' --format "{{.ID}}")

ฉันหวังว่านี่จะช่วยได้.


เราจะทำเช่นนี้กับหลาย ๆ ภาพตามชื่อตัวแทนได้หรือไม่?
ตัวแปร

3

ฉันยังได้คำตอบที่กระชับอีก การเปลี่ยนแปลงเพียงอย่างเดียวคือการลบ-I {}แฟล็กที่ไม่จำเป็น

docker images | grep 'imagename' | xargs docker rmi


3
docker rmi `docker images | awk '$1 ~ /imageName/ {print $3}'`

การดำเนินการนี้จะลบภาพทั้งหมดที่ใช้ชื่อ "imageName" ในบางกรณีสิ่งนี้อาจทำให้เกิดข้อผิดพลาดเช่น "รูปภาพถูกอ้างอิงในที่เก็บอย่างน้อยหนึ่งแห่ง" ในกรณีนั้นให้ใช้แรงลบ

docker rmi -f `docker images | awk '$1 ~ /imageName/ {print $3}'`

อีกวิธีหนึ่งสามารถ:

docker images | awk '{ OFS = ":" }$1 ~ /imageName/ {print $1,$2}'

3

ด้วยเหตุผลบางประการฉันไม่สามารถใช้คำตอบที่ให้มาที่นี่ได้ นี่คือสิ่งที่ใช้ได้ผลสำหรับฉัน

docker images | grep \"gcr.io/kubernetes-learn-197422/last-week-weather-service\" | awk '{print $3}' | xargs docker rmi

awk '{print $3}'เป็นส่วนสำคัญ มันแยก id จากคอลัมน์ที่ 3


3

สำหรับฉันใช้งานได้ ( Docker เวอร์ชัน 19.03.5 ):

docker rmi $(docker images 'imagename' -q)

คำสั่ง " docker images 'imagename' -q " จะแสดงรายการ id ภาพทั้งหมดของอาร์กิวเมนต์ที่อ้างถึงเดียวดังนั้นการเชื่อมต่อกับdocker rmi (หรือdocker rmi -fสำหรับการบังคับ) จะลบภาพทั้งหมดที่มีชื่อที่เลือก



0

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

docker images --format={{.ID}} | xargs -I % sh -c 'docker rmi --force % 2>&1'

0

docker rmi $(docker images --filter=reference="IMAGENAME:TAG")

ตัวอย่างเช่นหากฉันมีภาพต่อไปนี้

REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
abcdefg/hij                   7.0.0-beta-4.0      3128835950cd        7 days ago          51.4MB
abcdefg/hij-action            7.0.0-beta-4.0      42a7255beb74        7 days ago          97.4MB
abcdefg/hij-test              7.0.0-beta-4.0      17246aed35d0        7 days ago          97.4MB
abcdefg/hij-server            7.0.0-beta-4.0      42c45e561f2c        7 days ago          335MB
abcdefg/hij-init              7.0.0-beta-3.0      f648bb622933        7 days ago          55.2MB
abcdefg/hij-dir               7.0.0-beta-3.0      0db07d3aaccf        7 days ago          97.4MB
abcdefg/hij-mount             7.0.0-beta-3.0      18d1c0e1502c        4 weeks ago         33.7MB

จากนั้นdocker rmi $(docker images --filter=reference="abcd*:*4.0")จะลบสี่ภาพแรก

ข้อมูลเพิ่มเติมโปรดดูhttps://docs.docker.com/engine/reference/commandline/images/


ใช้งานได้ แต่จะดีกว่าถ้าเพิ่ม '-q' ลงในคำสั่งdocker rmi $(docker images -q --filter=reference="IMAGENAME:TAG")
docker

0

รวบรวมคำตอบสำหรับคำถามนี้เพื่อตอบสนองความต้องการของฉันซึ่งไม่ได้โพสต์ไว้ก่อนหน้านี้

ผมอยากให้ตรงกับภาพที่สร้างขึ้นในประเทศ: ที่ผมได้เปลี่ยนชื่อแท็กและผลักดันไปสู่การซื้อคืนภาคเอกชน:library/myapp myrepo.org/library/myappเมื่อพวกเขาถูกผลักดันฉันต้องการล้างข้อมูลนักเทียบท่าในเครื่อง

และฉันไม่สนใจว่าจะไม่พบสิ่งใดหรือคำสั่งทำให้เกิดข้อผิดพลาด เพิ่มดังนั้น|| trueในตอนท้ายเพื่อรวมไว้ในสคริปต์

docker rmi $(docker image ls */library/myApp --format '{{.Repository}}:{{.Tag}}') || true

0

จากคำตอบของ @ Aditya คุณยังสามารถสร้างฟังก์ชันทุบตีเพื่อลบภาพได้อย่างสบายใจ ใส่ฟังก์ชันนี้ลงใน~/.profileไฟล์. source ~/.profileสร้างเซสชันเปลือกใหม่หรือแหล่งที่มาของมันด้วย

function drmi() {
    docker images | grep $1 |  xargs docker rmi
}

การใช้งาน:

drmi golang

0

ข้อมูล:

docker rmi $(docker images --format "{{.Repository}}:{{.Tag}}" |grep imagename |grep none)

ให้ข้อผิดพลาดนี้:

การตอบสนองข้อผิดพลาดจาก daemon: รูปแบบการอ้างอิงไม่ถูกต้อง

อาจเป็นเพราะภาพของฉันมีลักษณะดังนี้:

hostname:5000/imagename:<none>

ฉันต้องใช้รหัสรูปภาพและทำตามคำสั่งนี้:

docker rmi `docker images --format "{{.Repository}}:{{.Tag}} {{.ID}}" |grep imagename |grep none |cut -d ' ' -f2`

ในการลบคอนเทนเนอร์ที่ออก:

docker container rm `docker container ls -a --format "{{.ID}} {{.Image}} {{.Status}}" |grep Exited |grep imagename|cut -d ' ' -f1`
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.