У меня следующая проблема с удалением изображения или тега в docker-registry v2:
У меня есть сервер, на котором работает докер-реестр. Я создал изображение и подтолкнул его, что теперь хочу исчезнуть. Теперь я хочу удалить изображение (или хотя бы тег, если изображение невозможно).
Текущая версия внешнего интерфейса не поддерживает такую функциональность.
Я пробовал через curl -u MY_USERNAME -X DELETE MY_DOMAIN:PORT/v2/IMAGE_NAME/manifests/REFERENCE
команда, как и HTTP API reference
состояния и ввел пароль, но в результате была пустая строка, не было ошибки аутентификации (аутентификация активирована) или сообщение об успешном завершении. Тег все еще доступен.
Поскольку у меня есть доступ к серверу, мне пришла в голову следующая идея: можно ли просто и безопасно удалить папку v2/repositories/IMAGE_NAME/_manifests/tags/VERSION
(или другой файл / папка)? Или это приводит к поломке реестра? Какие начальные шаги, например, остановить службу реестра, мне нужно сделать?
Да, они не упростили это, и это все еще не идеально, но API реестра v2 теперь имеет возможность удалять изображения.
Можно просто и безопасно удалить папку v2 / repositories / IMAGE_NAME / _manifests / tags / VERSION
Фактические данные изображения хранятся в каталоге BLOB-объектов на диске, но они используются разными манифестами, поэтому небезопасно просто очищать этот каталог, если вы не учли все изображения, которые могут совместно использовать BLOB-объекты.
Вот способ удалить изображение с помощью 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
Собираем дайджест изображений:
HEAD https://myprivateregistry:5001/v2/<image_name>/manifests/<image_tag>
Этот вызов возвращает ключ заголовка Docker-Content-Digest
с таким значением: sha256:b57z31xyz0f616e65f106b424f4ef29185fbd80833255d79dabc73b8eb873bd
Используя это значение из шага 2, запустите DELETE
http звонок:
DELETE https://myprivateregistry:5001/v2/<image_name>/manifests/sha256:b57z31xyz0f616e65f106b424f4ef29185fbd80833255d79dabc73b8eb873bd
API возвращает 202 Accepted
Запустите сборку мусора вручную, если вы не хотите ждать следующего запуска по расписанию: registry garbage-collect /etc/docker/registry/config.yml
Пример при запуске реестра как контейнера: docker exec -t registry-test ./bin/registry garbage-collect /etc/docker/registry/config.yml
Сборщик мусора удаляет связанные большие двоичные объекты и манифестирует с диска за вас.
На этом этапе тег image: полностью удаляется с диска и удаляется из реестра. Капли будут удалены, и вы увидите, что манифесты исчезли из v2/repositories/<image_name>/_manifests
ПРИМЕЧАНИЕ: Если это было последнее изображение в вашем репо, вам все равно придется вручную удалить список репо с диска (v2/repositories/<image_name>/_layers
) - однако это всего лишь метаданные. Фактические данные изображения уже удалены. Я считаю, что это может быть ошибка в сборщике мусора. У меня есть вопрос по этому поводу: Docker Private Registry - удалены все образы, но все еще отображаются в каталоге
БОЛЬШЕ ДЕТАЛЕЙ:
https://docs.docker.com/registry/spec/api/#deleting-an-image https://jsosic.wordpress.com/2017/01/23/deleting-images-from-docker-registry/