Как удалить ошибочно добавленный тег из образа в частном реестре 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]
Кажется, что на сегодняшний день нет простого метода удаления изображений из реестра, и похоже, что это функция для реестра. 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
content и создал 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:/#
Я не уверен, что это помогает или нет. Но, пожалуйста, взгляните на мое предложение здесь (Комментарий от mphanikumars)
Совсем недавно сам столкнулся с этим, но потом подумал, зачем удалять, я просто перевыпущу старую версию:
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
Сломанный образ все еще будет там, но вряд ли кто-то будет им пользоваться, так как доступна «более новая» версия. Очевидно, что лучше исправить ситуацию вперед, но в крайнем случае это быстрое решение.
Если причина, по которой вы хотите его удалить, заключается в том, что в нем есть секреты или что-то раскрытое, вы не хотите раскрывать, другие решения лучше, но предположите, что все, что было теперь известно, и измените его (пароли, ключи, что угодно).