ลบภาพ Docker ที่ติดแท็กออกจากรีจิสตรีส่วนตัว


10

ฉันจะลบแท็กที่เพิ่มผิดจากรูปภาพในรีจิสตรี Docker ได้อย่างไร ตัวเลือก -rmi ดูเหมือนจะไม่ทำงานกับภาพระยะไกลใน Docker 1.9.1

user@ubuntu-user:~$ docker --version  
Docker version 1.9.1, build a34a1d5

user@ubuntu-user:~$ docker search myregistry:5000/user/image
NAME                                                                     
myregistry:5000/user/image:20160119                                         
myregistry:5000/user/image:20160119-20160120        

user@ubuntu-user:~$ docker rmi myregistry:5000/user/image:20160119-20160120
Error response from daemon: could not find image: no such id: myregistry:5000/user/image:20160119-20160120
Error: failed to remove images: [myregistry:5000/user/image:20160119-20160120]

คำตอบ:


9

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

หนึ่งในตัวเลือกสิ่งที่เรามีวันนี้กับสิ่งนี้ไม่ทำงาน

anovil@ubuntu-anovil remove-registry]$ curl -X DELETE localhost:5000/v2/alpine/manifests/v1
{"errors":[{"code":"UNSUPPORTED","message":"The operation is unsupported."}]}
[anovil@ubuntu-anovil remove-registry]$ 

คือการลบมันออกจากรีจิสทรีด้วยตนเอง เพียงเพื่อหลีกเลี่ยงการลบไฟล์ผิดบังเอิญผมทดสอบกับสคริปต์นี้จาก GitHub ฉันไม่รับประกันว่าสคริปต์นี้จะทำงานอย่างไร (แม้ว่าฉันจะตรวจสอบอย่างรวดเร็วก่อนที่จะทดสอบ)

ดังนั้นฉันทำการทดสอบและดูเหมือนว่าจะทำงาน :)

[1] ฉันเข้าใจว่าคุณกำลังเรียกใช้รีจิสทรีด้วยตัวเทียบท่าเอง

[anovil@ubuntu-anovil remove-registry]$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
88f8e1a1d7a7        registry:2          "/bin/registry /etc/d"   37 minutes ago      Up 37 minutes       0.0.0.0:5000->5000/tcp   registry
[anovil@ubuntu-anovil remove-registry]$ 

[2] ฉันสร้างไฟล์ Dockerfile เพียงเล็กน้อยด้วยFROM alpineเนื้อหาและสร้างอัลไพน์: v1 และผลักไปที่รีจิสทรีส่วนตัวของฉันที่ทำงานบน localhost: 5000 ทำการค้นหาจากรีจิสตรีจะส่งคืนตามที่คาดไว้

[anovil@ubuntu-anovil remove-registry]$ curl -X GET localhost:5000/v2/alpine/tags/list
{"name":"alpine","tags":["v1"]}
[anovil@ubuntu-anovil remove-registry]$ 

[3] จากนั้นฉันลงชื่อเข้าใช้ในรีจิสทรีด้วยdocker execและตรวจสอบการใช้ดิสก์ก่อนที่จะทำการทดสอบ

root@88f8e1a1d7a7:/# du -sch /var/lib/registry/                     
2.5M    /var/lib/registry/
2.5M    total
root@88f8e1a1d7a7:/# 

[4] หลังจากกลับไปที่โฮสต์ของฉันฉันได้คัดลอกไฟล์ขนาดใหญ่ (mongodb.tgz) ลงในที่เก็บของฉันและสร้างเวอร์ชัน v2 ที่สร้างขึ้นและผลักดัน

[anovil@ubuntu-anovil remove-registry]$ docker build -t localhost:5000/alpine:v2 .
Sending build context to Docker daemon 61.99 MB
Step 1 : FROM alpine
 ---> 2314ad3eeb90
Step 2 : COPY mongodb.tgz /mongodb.tgz
 ---> d7c7645a3fe2
Successfully built d7c7645a3fe2
[anovil@ubuntu-anovil remove-registry]$ docker push localhost:5000/alpine:v2
The push refers to a repository [localhost:5000/alpine] (len: 1)
d7c7645a3fe2: Pushed 
5ff05309724e: Image already exists 
v2: digest: sha256:7bea1ec2910170bd88412b622aee6129791673cf1fd8c0e1e34f15ec26428774 size: 4467
[anovil@ubuntu-anovil remove-registry]$ 

[5] หลังจากตรวจสอบขนาดอีกครั้งในรีจิสทรีมันเพิ่มขึ้นเป็น 62MB:

root@88f8e1a1d7a7:/# du -sch /var/lib/registry/                                                                               
62M /var/lib/registry/
62M total
root@88f8e1a1d7a7:/# 

[6] ในการใช้delete_docker_registry_imageงานคุณต้องนำสคริปต์ไปไว้ในคอนเทนเนอร์ที่โฮสต์รีจิสตรีซึ่งมีตัวเลือกหนึ่งให้ทำด้วย curl jqนอกจากนี้สคริปนี้ต้อง

root@88f8e1a1d7a7:/# apt-get update && apt-get install -y curl jq
...
root@88f8e1a1d7a7:/#

[7] เรียกใช้สคริปต์ลองด้วย--dry-runตัวเลือกก่อนและอย่าลืมแท็กเวอร์ชัน (v2 ในกรณีนี้) นอกจากนี้ยังมี-h

root@88f8e1a1d7a7:/# delete_docker_registry_image --image alpine:v2 --dry-run
DRY_RUN: would have deleted tag directory: repositories/alpine/_manifests/tags/v2
DRY_RUN: would have deleted manifest revision: repositories/alpine/_manifests/revisions/sha256/7bea1ec2910170bd88412b622aee6129791673cf1fd8c0e1e34f15ec26428774
DRY_RUN: would have deleted directory: blobs/sha256/e2/e2cc9aed084e01fa5cf93c09121035ac4d712113425ae68b678c28591beec5c6
DRY_RUN: would have deleted directory: blobs/sha256/7a/7ada67971e952e353ab14d8f9bdd4e41e4c41099b05a5da09f2700b51d93908a
DRY_RUN: would have deleted directory: blobs/sha256/7b/7bea1ec2910170bd88412b622aee6129791673cf1fd8c0e1e34f15ec26428774
DRY_RUN: would have deleted layer metadata directory: repositories/alpine/_layers/sha256/e2cc9aed084e01fa5cf93c09121035ac4d712113425ae68b678c28591beec5c6
root@88f8e1a1d7a7:/# delete_docker_registry_image --image alpine:v2          
root@88f8e1a1d7a7:/#

[8] และ voila !!

root@88f8e1a1d7a7:/# du -sch /var/lib/registry/                     
2.5M    /var/lib/registry/
2.5M    total
root@88f8e1a1d7a7:/#  

0

ฉันไม่แน่ใจว่าสิ่งนี้จะช่วยได้หรือไม่ แต่โปรดดูคำแนะนำของฉันที่นี่ (ความคิดเห็นจาก mphanikumars)

https://github.com/docker/docker-registry/issues/988


4
คุณอาจต้องการที่จะแทรกข้อมูลสำคัญจากลิงค์ที่นี่เนื่องจากบางครั้งลิงก์มักจะออฟไลน์หรือถูกลบออกเมื่อเวลาผ่านไป
Dennis Nolte

0

เพิ่งวิ่งเข้าไปหาตัวเองนี้ แต่แล้วคิดว่าทำไมลบฉันจะเพิ่งปล่อยรุ่นเก่ากว่า:

docker push my/image:1.0.0
docker push my/image:1.0.1 # This is broken

docker tag  my/image:1.0.0 my/image:1.0.2
docker push my/image:1.0.2

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

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


1
ดังนั้นพื้นที่จัดเก็บข้อมูลที่จำเป็นต้องเพิ่มขึ้นและเติบโตขึ้นเมื่อมีการผลักรูปภาพมากขึ้น แต่ไม่เคยกำจัดทิ้ง?
emmdee

@emmee ดีฉันหมายถึงใช่ ... แต่โปรดจำไว้ว่าดิสก์ฉลาดมันเป็นเพียงการจัดเก็บ deltas ระหว่างการแก้ไขเช่นเดียวกับคอมไพล์ สำหรับภาพที่มีขนาดเท่ากับ 1 GB นั่นไม่ได้หมายความว่าทุกครั้งที่คุณปล่อยรุ่นใหม่จะมีการใช้งานอีก 1 GB บนดิสก์
Michael Butler
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.