hapus gambar Docker yang ditandai dari registri pribadi


10

Bagaimana saya bisa 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 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]

Jawaban:


9

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

Salah satu opsi yang kita miliki saat ini dengan ini tidak berfungsi

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 skrip ini dari github . Saya tidak menjamin bagaimana script ini bekerja (walaupun saya memeriksanya dengan cepat sebelum saya mengujinya).

Jadi, saya membuat tes dan sepertinya berhasil :)

[1] Saya kira, Anda menjalankan registri dengan buruh pelabuhan itu sendiri.

[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] Saya membuat Dockerfile minimal hanya dengan FROM alpinekonten dan membuat alpine: v1 dan mendorong ke registri pribadi saya yang berjalan di localhost: 5000. Meminta dari registri, ia 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 execdan memeriksa penggunaan disk sebelum saya melakukan percobaan

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

[4] Setelah kembali ke host saya, saya menyalin file yang berat (mongodb.tgz) ke 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 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] Setelah memeriksa ukuran lagi di registri, ukurannya telah meningkat menjadi 62MB:

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

[6] Untuk dapat menjalankannya delete_docker_registry_image, Anda harus memasukkan skrip ke dalam wadah yang menjadi tempat hosting 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 skrip, coba dengan --dry-runopsi terlebih dahulu dan jangan lupa tag versi (v2 dalam hal ini), ada juga yang bagus-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] Dan voila !!

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


0

Baru saja menjalankan ini sendiri, tetapi kemudian berpikir, mengapa menghapus, saya hanya akan merilis kembali versi yang lebih lama:

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

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

Jika alasan Anda ingin menghapusnya adalah karena memiliki rahasia atau sesuatu yang Anda tidak ingin keluar, solusi lain lebih baik, tetapi anggap apa pun yang dikenal dan ubahlah (kata sandi, kunci, apa pun).


1
Jadi ruang penyimpanan yang dibutuhkan hanya tumbuh dan tumbuh karena lebih banyak gambar didorong tetapi tidak pernah dibersihkan?
emmdee

@emmdee yah maksudku ya ... tapi ingat, disk-bijaksana itu hanya menyimpan delta di antara revisi, sama seperti git. untuk gambar yang akhirnya menjadi 1 GB, itu tidak berarti setiap kali Anda merilis versi baru itu adalah 1 GB lain yang digunakan pada disk.
Michael Butler
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.