видалити позначене зображення 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] Я припускаю, що ви запускаєте реєстр із самим docker.

[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вмістом і створив 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] Після повторної перевірки розміру в реєстрі він збільшився до 62 Мб:

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] І вуаля !!

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/isissue/988


4
ви можете вставити сюди важливу інформацію з цього посилання, оскільки посилання іноді не в режимі офлайн або видаляються з часом.
Денніс Нолте

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

@emmdee добре, я маю на увазі, так ... але пам’ятайте, що на дисках він зберігає лише дельти між редакціями, як і git. для зображення, яке закінчується 1 Гб, це не означає, що кожного разу, коли ви випускаєте нову версію, це ще 1 Гб використовується на диску.
Майкл Батлер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.