Личный реестр Docker - Удалены все изображения, но они все еще отображаются в каталоге

Следуя официальной документации (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

Вот высокоуровневый метод того, что я сделал, чтобы удалить изображение:

  1. Сбор дайджеста изображений: HEAD https://myprivateregistry:5001/v2/myimage/manifests/mytag с "Accept: application/vnd.docker.distribution.manifest.v2+json" добавлено в заголовок при вызове

  2. Вызов возвращает ключ заголовка Docker-Content-Digest с таким значением, как sha256:b57z31xyz0f616e65f106b424f4ef29185fbd80833255d79dabc73b8eb873bd

  3. Используя это значение из шага 2, запустите вызов удаления: DELETE https://myprivateregistry:5001/v2/myimage/manifests/sha256:b57z31xyz0f616e65f106b424f4ef29185fbd80833255d79dabc73b8eb873bd

  4. API реестра возвращает 202 Accepted

  5. Запустите сборку мусора вручную: registry garbage-collect /etc/docker/registry/config.yml

  6. Сборщик мусора удаляет связанные двоичные объекты с диска (журнал здесь опущен, но он успешно удаляет двоичные объекты)

На данный момент я могу подтвердить, что большие двоичные объекты полностью удалены с диска, и я больше не могу вызывать сведения об изображении (как на шаге 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 каталог с теми же перечисленными 5-кратными слоями. Похоже, именно по этой причине он все еще числится в списке _catalog

Когда я удаляю myimage папка (из docker/registry/v2/repositories/myimage), то хранилище больше не отображается в _catalog

Это, по-видимому, способ очистить его от _catalog перечисление. Однако - что, если изображение имеет 2 тега, но удален только 1 - есть ли причина удалять что-либо из _layers в таком случае? Как это можно было бы сделать с несколькими версиями изображения? Очевидно, что я не могу просто ударить по _layers каталог в качестве окончательного метода, поскольку в реальном мире будет много помеченных версий изображения. Так что это нужно делать разумно.

Мне просто трудно найти какую-либо документацию по обслуживанию / обслуживанию реестра Docker или схемы для _layers подкаталог и почему сборщик мусора не очищает этот каталог так же, как он делает с манифестами и большими двоичными объектами.

После долгих исследований в настоящее время не существует способа полного удаления записей каталога только через API.

Реестр v2 не позволяет удалять только определенные теги из изображения

Это означает, что все изображение целиком удаляется. Удаление тегов находится в открытом доступе для будущей версии реестра (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

https://github.com/docker/distribution/pull/2169

https://docs.docker.com/registry/spec/api/