Hapus gambar Docker yang ditandai dari registri pribadi

Bagaimana cara menghapus tag yang salah ditambahkan dari gambar di registri Docker pribadi? Opsi-rmi tampaknya tidak berfungsi untuk gambar jarak jauh di Docker 1.9.1.

user@ubuntu-user:~$ docker --version  Docker version 1.9.1, build a34a1d5user@ubuntu-user:~$ docker search myregistry:5000/user/imageNAME                                                                     myregistry:5000/user/image:20160119                                         myregistry:5000/user/image:20160119-20160120        user@ubuntu-user:~$ docker rmi myregistry:5000/user/image:20160119-20160120Error response from daemon: could not find image: no such id: myregistry:5000/user/image:20160119-20160120Error: failed to remove images: [myregistry:5000/user/image:20160119-20160120]

Tampaknya tidak ada metode sederhana untuk menghapus gambar dari registri pada hari ini dan sepertinya fitur untuk registri 2.1 tonggak sejarah.

Salah satu pilihan apa yang kita miliki saat ini dengan ini tidak bekerja

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]$ 

adalah menghapusnya secara manual dari registri itu sendiri. Hanya untuk menghindari menghapus file yang salah secara tidak sengaja, saya mengujinya dengan script ini dari github. Saya tidak menjamin Bagaimana skrip ini bekerja (meskipun saya memeriksanya dengan cepat sebelum saya mengujinya).

Jadi, saya membuat tes dan itu sepertinya berhasil :)

[1] saya kira, Anda menjalankan registri dengan docker itu sendiri.

[anovil@ubuntu-anovil remove-registry]$ docker psCONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES88f8e1a1d7a7        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] saya membuat Dockerfile minimal hanya dengan FROM alpine konten dan dibuat alpine: v1 dan didorong ke registri pribadi saya yang berjalan di localhost:5000. Query dari registri, itu kembali seperti yang diharapkan.

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

[3] Kemudian saya masuk ke registri dengan docker exec dan memeriksa penggunaan disk sebelum saya melakukan percobaan saya

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

[4] setelah kembali ke host saya, saya menyalin file yang berat (mongodb.tgz) ke dalam wadah saya dan membuat versi V2 yang dibangun dan didorong.

[anovil@ubuntu-anovil remove-registry]$ docker build -t localhost:5000/alpine:v2 .Sending build context to Docker daemon 61.99 MBStep 1 : FROM alpine ---> 2314ad3eeb90Step 2 : COPY mongodb.tgz /mongodb.tgz ---> d7c7645a3fe2Successfully built d7c7645a3fe2[anovil@ubuntu-anovil remove-registry]$ docker push localhost:5000/alpine:v2The 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] Setelah memeriksa ukuran lagi dalam registri, telah meningkat menjadi 62MB:

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

[6] untuk menjalankan delete_docker_registry_image, Anda perlu memasukkan skrip ke dalam wadah yang menghosting registri, salah satu opsi untuk melakukannya adalah dengan curl. Juga, skrip ini membutuhkan jq.

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

[7] Jalankan script, coba dengan --dry-run opsi pertama dan jangan lupa tag Versi (v2 dalam hal ini), ada juga yang baik -h

root@88f8e1a1d7a7:/# delete_docker_registry_image --image alpine:v2 --dry-runDRY_RUN: would have deleted tag directory: repositories/alpine/_manifests/tags/v2DRY_RUN: would have deleted manifest revision: repositories/alpine/_manifests/revisions/sha256/7bea1ec2910170bd88412b622aee6129791673cf1fd8c0e1e34f15ec26428774DRY_RUN: would have deleted directory: blobs/sha256/e2/e2cc9aed084e01fa5cf93c09121035ac4d712113425ae68b678c28591beec5c6DRY_RUN: would have deleted directory: blobs/sha256/7a/7ada67971e952e353ab14d8f9bdd4e41e4c41099b05a5da09f2700b51d93908aDRY_RUN: would have deleted directory: blobs/sha256/7b/7bea1ec2910170bd88412b622aee6129791673cf1fd8c0e1e34f15ec26428774DRY_RUN: would have deleted layer metadata directory: repositories/alpine/_layers/sha256/e2cc9aed084e01fa5cf93c09121035ac4d712113425ae68b678c28591beec5c6root@88f8e1a1d7a7:/# delete_docker_registry_image --image alpine:v2          root@88f8e1a1d7a7:/#

[8] dan voila !!

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

Baru-baru ini berlari ke ini sendiri, tetapi kemudian berpikir, mengapa menghapus, saya hanya akan merilis ulang versi yang lebih lama:

docker push my/image:1.0.0docker push my/image:1.0.1 # This is brokendocker tag  my/image:1.0.0 my/image:1.0.2docker push my/image:1.0.2

Gambar yang rusak akan tetap ada, tetapi tidak mungkin ada orang yang akan menggunakannya karena ada versi "lebih baru" yang tersedia. Jelas lebih baik untuk memperbaiki ke depan tetapi dalam keadaan darurat ini adalah solusi cepat.

Jika alasan Anda ingin menghapusnya adalah karena ia memiliki rahasia atau sesuatu yang terbuka yang tidak ingin Anda keluarkan, solusi lain lebih baik, tetapi asumsikan apa pun yang sekarang diketahui dan ubah (kata sandi, kunci, apa pun).