удалить помеченное изображение 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]
user3105453
источник

Ответы:

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содержимым и создал 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:/#  
Maniankara
источник
0

Я не уверен, что это помогает или нет. Но, пожалуйста, посмотрите мое предложение здесь (комментарий от mphanikumars)

https://github.com/docker/docker-registry/issues/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

Разбитое изображение все еще будет там, но вряд ли кто-то будет его использовать, так как доступна «более новая» версия. Очевидно, что это лучше исправить вперед, но в крайнем случае это быстрое решение.

Если причина, по которой вы хотите удалить его, заключается в том, что у него есть секреты или что-то раскрытое, а вы не хотели выходить из него, другие решения лучше, но примите, что бы оно ни было, теперь известно и измените его (пароли, ключи, что угодно).

DanielM
источник
1
Таким образом, необходимое пространство для хранения только увеличивается и увеличивается, поскольку все больше изображений выдвигаются, но никогда не удаляются?
Эмми
@emmdee, ну, я имею в виду, да ... но помните, что на диске он хранит дельты только между ревизиями, как git. для образа размером 1 ГБ это не означает, что каждый раз, когда вы выпускаете новую версию, на диске используется еще 1 ГБ.
Майкл Батлер