Docker Private Registry - удалил все изображения, но все еще показываю в каталоге
Следуя официальной документации ( https://docs.docker.com/registry/spec/api/), я смог успешно удалить изображение. Как и ожидалось, после удаления изображение больше не может быть извлечено, а его манифест не вызван через 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
Сборщик мусора удаляет связанные BLOB-объекты с диска (здесь журнал пропущен, но успешно удаляет BLOB-объекты)
На этом этапе я могу подтвердить, что большие двоичные объекты полностью удалены с диска, и я больше не могу вызывать детали изображения (как в шаге 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
листинга. Однако - что если изображение имеет 2x тега, но удаляется только 1 - есть ли причина удалить что-либо из _layers
в таком случае? Как это будет обрабатываться с несколькими версиями изображения? Очевидно, я не могу просто заткнуть _layers
каталог как последний метод, так как в реальном мире будет много теговых версий изображения. Так что это должно быть сделано разумно.
Мне просто трудно найти какую-либо документацию по обслуживанию / содержанию реестра Docker или схему для
_layers
подкаталог и почему сборщик мусора не очищает этот каталог так же, как с манифестами и BLOB-объектами.
1 ответ
После долгих исследований, в настоящее время не существует метода полного удаления записей каталога только через 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