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