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

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

  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. Сборщик мусора удаляет связанные 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

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

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

Другие вопросы по тегам