Удалить образ реестра в реестре, удалив файлы / папки на сервере

У меня есть следующая проблема с удалением изображения или тега в Docker-Registry v2:

У меня есть сервер, на котором работает Docker-Registry. Я создал образ и подтолкнул его, что теперь я хочу уйти. Теперь я хочу удалить изображение (или хотя бы тег, если изображение невозможно).

Текущая версия веб-интерфейса не поддерживает такую ​​функциональность.

Я пробовал через curl -u MY_USERNAME -X DELETE MY_DOMAIN:PORT/v2/IMAGE_NAME/manifests/REFERENCE команда, как HTTP API reference состояния и ввели пароль, но в результате выполнения была пустая строка, нет ошибки аутентификации (аутентификация активирована) или сообщение об успешном завершении. Тег все еще доступен.

Поскольку у меня есть доступ к серверу, у меня возникла следующая идея: могу ли я просто и безопасно просто удалить папку v2/repositories/IMAGE_NAME/_manifests/tags/VERSION (или другой файл / папка)? Или это приводит к поломке реестра? Какие начальные шаги, такие как остановка службы реестра, мне нужно сделать?

1 ответ

Решение

Да, они не сделали это простым, и это все еще не идеально, но API реестра v2 теперь имеет возможность удалять изображения.

Можно ли просто и безболезненно просто удалить папку v2/repositories/IMAGE_NAME/_manifests/tags/VERSION

Фактические данные изображений хранятся в каталоге BLOB-объектов на диске, но они совместно используются различными манифестами, поэтому небезопасно просто удалять этот каталог, если вы не рассмотрели все изображения, которые могут совместно использовать большие объекты.

Вот метод для удаления изображения с помощью Docker API v2:

Во-первых, в вашем реестре должна быть включена функция DELETE. Либо установите env var:

REGISTRY_STORAGE_DELETE_ENABLED: "true"

или в config.yml нужно установить

storage:
  delete:
    enabled: true

Затем запустите удаление через вызовы API (Вы можете легко протестировать через Postman или просто используя curl/etc)

ПРИМЕЧАНИЕ. В приведенных ниже вызовах добавьте "Accept: application/vnd.docker.distribution.manifest.v2+json" к заголовку HTTP

  1. Соберите дайджест изображения:

    HEAD https://myprivateregistry:5001/v2/<image_name>/manifests/<image_tag>

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

  2. Используя это значение из шага 2, запустите DELETE http вызов:

    DELETE https://myprivateregistry:5001/v2/<image_name>/manifests/sha256:b57z31xyz0f616e65f106b424f4ef29185fbd80833255d79dabc73b8eb873bd

    Возврат API 202 Accepted

  3. Запустите сборку мусора вручную, если вы не хотите ждать следующего запланированного запуска: registry garbage-collect /etc/docker/registry/config.yml

    Пример, если реестр работает как контейнер: docker exec -t registry-test ./bin/registry garbage-collect /etc/docker/registry/config.yml

    Сборщик мусора удаляет связанные BLOB-объекты и манифесты с диска для вас.

В этот момент тег image: полностью удаляется с диска и удаляется из реестра. BLOB-объекты удалены, и вы увидите, что манифесты исчезли из v2/repositories/<image_name>/_manifests

ПРИМЕЧАНИЕ. Если это было последнее изображение в вашем репо, вам все равно придется вручную удалить список репо с диска (v2/repositories/<image_name>/_layers) - однако это всего лишь метаданные. Фактические данные изображения уже были удалены. Я считаю, что это может быть ошибка в сборщике мусора. У меня есть вопрос об этом здесь: Docker Private Registry - Удалил все изображения, но все еще отображается в каталоге

БОЛЬШЕ ДЕТАЛЕЙ:

https://docs.docker.com/registry/spec/api/ https://jsosic.wordpress.com/2017/01/23/deleting-images-from-docker-registry/

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