Следуя официальной документации (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
каталог с теми же перечисленными 5-кратными слоями. Похоже, именно по этой причине он все еще числится в списке _catalog
Когда я удаляю myimage
папка (из docker/registry/v2/repositories/myimage
), то хранилище больше не отображается в _catalog
Это, по-видимому, способ очистить его от _catalog
перечисление. Однако - что, если изображение имеет 2 тега, но удален только 1 - есть ли причина удалять что-либо из _layers
в таком случае? Как это можно было бы сделать с несколькими версиями изображения? Очевидно, что я не могу просто ударить по _layers
каталог в качестве окончательного метода, поскольку в реальном мире будет много помеченных версий изображения. Так что это нужно делать разумно.
Мне просто трудно найти какую-либо документацию по обслуживанию / обслуживанию реестра Docker или схемы для
_layers
подкаталог и почему сборщик мусора не очищает этот каталог так же, как он делает с манифестами и большими двоичными объектами.