Удалить образ реестра в реестре, удалив файлы / папки на сервере
У меня есть следующая проблема с удалением изображения или тега в 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
Соберите дайджест изображения:
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
Сборщик мусора удаляет связанные 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/