Я запустил личный реестр докеров и хочу удалить все изображения, кроме как latest
из репозитория. Я не хочу удалять весь репозиторий, только некоторые изображения внутри него. Документы API не упоминают способ сделать это, но, конечно, это возможно?
163
Ответы:
В настоящее время вы не можете использовать API реестра для этой задачи. Это позволяет только удалить репозиторий или определенный тег.
Как правило, удаление репозитория означает, что все теги, связанные с этим репо, будут удалены.
Удаление тега означает, что связь между изображением и тегом удалена.
Ни один из вышеперечисленных не удалит одно изображение. Они остались на вашем диске.
Временное решение
Для этого обходного пути вам нужно, чтобы ваши изображения докера хранились локально.
Обходным решением для вашего решения будет удаление всех тегов, кроме самых последних, и, следовательно, удаление ссылки на связанные изображения. Затем вы можете запустить этот скрипт, чтобы удалить все изображения, на которые не ссылаются ни теги, ни родословная какого-либо использованного изображения.
Терминология (изображения и теги)
Рассмотрим график изображения , как это , где заглавные буквы (
A
,B
, ...) представляют собой короткие идентификаторы изображений и<-
означает , что изображение на основе другого изображения:Теперь добавим теги к картинке:
Здесь тег
<version1>
ссылается на изображение,C
а тег<version2>
ссылается на изображениеD
.Уточнение вашего вопроса
В своем вопросе вы сказали, что хотите удалить
, Теперь эта терминология не совсем верна. Вы смешали изображения и теги. Глядя на график, я думаю, вы согласитесь, что тег
<version2>
представляет последнюю версию. На самом деле, согласно этому вопросу у вас может быть тег, который представляет последнюю версию:Поскольку
<latest>
тег ссылается на изображение,D
я спрашиваю вас: вы действительно хотите удалить все, кроме изображенияD
? Возможно нет!Что произойдет, если вы удалите тег?
Если вы удалите тег
<version1>
с помощью Docker REST API, вы получите следующее:Помните: Docker никогда не удалит изображение! Даже если это так, в этом случае он не может удалить изображение, так как изображение
C
является частью предка для изображения,D
которое помечено.Даже если вы используете этот скрипт , ни одно изображение не будет удалено.
Когда изображение может быть удалено
При условии, что вы можете контролировать, когда кто-то может вытянуть или протолкнуть ваш реестр (например, отключив интерфейс REST). Вы можете удалить изображение из графического изображения, если на нем нет другого изображения и на него нет ссылок.
Обратите внимание , что в следующем графике, то изображение
D
будет не на основе ,C
а наB
. ПоэтомуD
не зависит отC
. Если вы удалите тег<version1>
на этом графике, изображениеC
не будет использоваться никаким изображением, и этот скрипт может удалить его.После очистки ваш граф изображений выглядит так:
Это то, что вы хотите?
источник
Я столкнулся с той же проблемой с моим реестром, а затем попробовал решение, перечисленное ниже, со страницы блога. Оно работает.
Шаг 1: Список каталогов
Вы можете перечислить свои каталоги, позвонив по этому адресу:
Ответ будет в следующем формате:
Шаг 2: список тегов для соответствующего каталога
Вы можете перечислить теги своего каталога, вызвав этот URL:
Ответ будет в следующем формате:
}
Шаг 3. Перечислите значение манифеста для связанного тега
Вы можете выполнить эту команду в контейнере реестра Docker:
Ответ будет в следующем формате:
Запустите приведенную ниже команду со значением manifest:
Шаг 4: Удалить помеченные манифесты
Запустите эту команду в вашем контейнере Docker Registy:
Вот мой config.yml
источник
Deleteing blob: /docker/...
", но это не изменило используемое дисковое пространство. Использование bin / registry github.com/docker/distribution v2.4.1 .Docker-Content-Digest
часть должна быть в нижнем регистре (проверено на Docker двигателя v18.09.2) , т.е.curl -v --silent -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -X GET http://localhost:5000/v2/<name>/manifests/<tag> 2>&1 | grep docker-content-digest | awk '{print ($3)}'
Текущий
v2
реестр теперь поддерживает удаление черезDELETE /v2/<name>/manifests/<reference>
Смотрите: https://github.com/docker/distribution/blob/master/docs/spec/api.md#deleting-an-image
Рабочее использование: https://github.com/byrnedo/docker-reg-tool
Изменить: манифест
<reference>
выше может быть получен из запросаGET /v2/<name>/manifests/<tag>
и проверка
Docker-Content-Digest
заголовка в ответе.Изменить 2: Возможно, вам придется запустить ваш реестр со следующим набором env:
REGISTRY_STORAGE_DELETE_ENABLED="true"
Edit3: вам может потребоваться запустить сборку мусора, чтобы освободить это дисковое пространство: https://docs.docker.com/registry/garbage-collection/
источник
DELETE
.{"errors":[{"code":"UNSUPPORTED","message":"The operation is unsupported."}]}
Проблема 1
Вы упомянули, что это был ваш личный реестр докеров, поэтому вам, вероятно, нужно проверить API реестра, а не Doc Registry API. , который является связующим звеном вы предоставили.
Проблема 2
API реестра Docker - это протокол клиент-сервер, который зависит от того, реализует ли сервер необходимость удаления изображений в серверной части. (Я думаю)
Подробное объяснение
Ниже я продемонстрирую, как это работает сейчас, исходя из вашего описания и моего понимания ваших вопросов.
Вы запускаете, вы запускаете частный реестр Docker, я использую один по умолчанию и слушаю в
5000
портуЗатем я помечаю местное изображение и нажимаю на него.
После этого вы можете использовать Registry API для проверки его существования в вашем личном реестре Docker.
Теперь я могу удалить тег с помощью этого API!
Проверьте еще раз, тег не существует на вашем частном сервере реестра
источник
registry
изображения. SSHing и запуск скрипта работает, даже если он не идеален. В качестве примечания я все еще думаю, что это неполный API - вы можете удалять теги, но если вы ПОЛУЧИТЕ,/images
вы все равно увидите все оставшиеся данные изображения.Это действительно некрасиво, но работает, текст проверен в реестре: 2.5.1. Мне не удалось добиться, чтобы удаление работало гладко даже после обновления конфигурации, чтобы разрешить удаление. Удостоверение было действительно трудно получить, пришлось войти, чтобы получить его, возможно, какое-то недопонимание. Во всяком случае, следующие работы:
Вход в контейнер
Определите переменные, соответствующие вашему контейнеру и версии контейнера:
Перейдите в каталог реестра:
Удалите файлы, связанные с вашим хешем:
Удалить манифесты:
Выйти
Запустите GC:
Если все было сделано правильно, отображается некоторая информация об удаленных BLOB-объектах.
источник
Есть некоторые клиенты (в Python, Ruby и т. Д.), Которые делают именно это. На мой вкус, невозможно установить среду выполнения (например, Python) на мой сервер реестра, просто чтобы содержать мой реестр!
Как
deckschrubber
и мое решение:изображения старше указанного возраста автоматически удаляются. Возраст может быть указан с помощью
-year
,-month
,-day
или их сочетание:ОБНОВЛЕНИЕ : вот краткое введение в deckschrubber.
источник
deckschrubber
это очень хорошо - очень прост в установке (один двоичный файл), и позволяет удалять изображения как по имени (с регулярным выражением), так и по возрасту.ERRO[0000] Could not delete image! repo=.... tag=latest
: /Кратко;
1) Вы должны ввести следующую команду для RepoDigests репозитория Docker;
2) Используйте реестр REST API
Вы должны получить 202 Принято для успешного вызова.
3-) Запустить сборщик мусора
registry - имя контейнера реестра.
Для более подробного объяснения введите ссылку здесь
источник
Этот образ докера включает скрипт bash, который можно использовать для удаления изображений из удаленного реестра v2: https://hub.docker.com/r/vidarl/remove_image_from_registry/
источник
Ниже Bash Script Удаляет все теги, расположенные в реестре, кроме самых последних.
После этого бега
источник
Простой скрипт ruby, основанный на этом ответе: registry_cleaner .
Вы можете запустить его на локальной машине:
./registry_cleaner.rb --host=https://registry.exmpl.com --repository=name --tags_count=4
А потом на системном реестре удаляю капли с
/bin/registry garbage-collect /etc/docker/registry/config.yml
.источник
Вот сценарий, основанный на ответе Явуз Серта. Он удаляет все теги, которые не являются последней версией, и их тег больше 950.
источник