Следуя официальной документации (https://docs.docker.com/registry/spec/api/#deleting-an-image) Мне удалось успешно удалить изображение. Как и ожидалось, после удаления изображение больше не может быть извлечено, а его манифест вызван через API.
Я чувствую, что сделал сложную часть работы, однако проблема в том, что репо по-прежнему указано в /v2/_catalog
после завершения удаления. Я пытаюсь полностью очистить реестр.
Вот мой файл для создания реестра:
registry:
image: registry:2.5.2
container_name: registry-test
ports:
- 5007:5000
environment:
REGISTRY_STORAGE: s3
REGISTRY_HTTP_TLS_CERTIFICATE: /etc/cert.crt
REGISTRY_HTTP_TLS_KEY: /etc/cert.key
REGISTRY_STORAGE_S3_ACCESSKEY: ******
REGISTRY_STORAGE_S3_SECRETKEY: ******
REGISTRY_STORAGE_S3_REGION: us-west-1
REGISTRY_STORAGE_S3_BUCKET: ******
REGISTRY_STORAGE_S3_SECURE: "true"
REGISTRY_STORAGE_DELETE_ENABLED: "true"
volumes:
- /dockerdata/volumes/registry-test/etc/cert.crt:/etc/cert.crt
- /dockerdata/volumes/registry-test/etc/cert.key:/etc/cert.key
restart: unless-stopped
Вот высокоуровневый метод того, что я сделал для удаления изображения:
Собираем дайджест изображений: HEAD https://myprivateregistry:5001/v2/myimage/manifests/mytag
с участием "Accept: application/vnd.docker.distribution.manifest.v2+json"
добавлен в шапку по звонку
Вызов возвращает ключ заголовка Docker-Content-Digest
со значением, например sha256:b57z31xyz0f616e65f106b424f4ef29185fbd80833255d79dabc73b8eb873bd
Используя это значение из шага 2, запустите вызов удаления: DELETE https://myprivateregistry:5001/v2/myimage/manifests/sha256:b57z31xyz0f616e65f106b424f4ef29185fbd80833255d79dabc73b8eb873bd
API реестра возвращает 202 Accepted
Запустить сборку мусора вручную: registry garbage-collect /etc/docker/registry/config.yml
Сборщик мусора удаляет связанные большие двоичные объекты с диска (журнал здесь опущен, но он успешно удаляет большие двоичные объекты)
На этом этапе я могу подтвердить, что капли полностью удалены с диска, и я больше не могу вызывать детали изображения (как на шаге 1 выше) так что я думал, что закончил.
Однако при запуске: /v2/_catalog
мое связанное репо все еще перечисляется (хотя в нем нет изображений)! Очевидно, его нельзя тянуть или использовать, но как я могу полностью удалить это репо из этого списка теперь, когда с ним не связаны изображения?
Я нигде не вижу как должным образом удалите это на странице документации API. Может, я где-то скучаю?
РЕДАКТИРОВАТЬ -
Я хотел добавить дополнительную информацию о том, как выглядит реестр до и после удаления, указанного выше.
Перед операцией удаления выше:
docker/registry/v2/repositories/myimage/_manifests/revisions/...
docker/registry/v2/repositories/myimage/_manifests/tags/...
docker/registry/v2/repositories/myimage/_layers/sha256/... (5 layers listed)
docker/registry/v2/blobs/sha256/...
После операции удаления выше:
docker/registry/v2/repositories/myimage/_layers/sha256/... (5 layers listed)
Так что осталось только _layers
каталог с теми же перечисленными 5x слоями. Похоже, это причина, по которой он все еще указан в _catalog
Когда я удаляю myimage
папка (из docker/registry/v2/repositories/myimage
), то репозиторий больше не отображается в _catalog
Кажется, это способ очистить его от _catalog
листинг. Однако - что, если изображение имеет 2 тега, но удален только 1 - есть ли причина удалять что-либо из _layers
в таком случае? Как это будет обрабатываться с несколькими версиями изображения? Очевидно, я не могу просто заткнуть _layers
каталог в качестве последнего метода, поскольку в реальном мире будет много версий изображения с тегами. Так что это нужно делать с умом.
Мне просто трудно найти какую-либо документацию по обслуживанию / поддержанию реестра Docker или схему для
_layers
подкаталог и почему сборщик мусора не очищает этот каталог так же, как с манифестами и большими двоичными объектами.
После долгих исследований не существует текущего метода полного удаления записей каталога только через API.
Реестр v2 не позволяет удалять с изображения только определенные теги
Это означает, что все изображение удален. Удаление тегов является открытым PR для будущей версии реестра (https://github.com/docker/distribution/pull/2169)
Что это значит в отношении этого вопроса заключается в том, что правильный метод - удалить изображение из списка репо в точности так, как вы предполагали. Удалите его с диска. (Такие как rm -r v2/repositories/myimage
где myimage
это имя изображения, которое вы удалили через API.)
Затем он будет удален из списка репо в _catalog
и вы закончили процесс удаления. Нет необходимости перезапускать что-либо, подобное упомянутому другому ответу.
Когда добавлена возможность удалять определенные теги из реестра, эта процедура изменится. А пока все или ничего.
Ссылка:
https://forums.docker.com/t/delete-repository-from-v2-private-registry/16767/5