Назад | Перейти на главную страницу

Docker Private Registry - удалены все образы, но все еще отображаются в каталоге.

Следуя официальной документации (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 каталог с теми же перечисленными 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

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

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