В настоящее время вы не можете использовать API реестра для этой задачи. Это позволяет только удалить репозиторий или определенный тег.
Как правило, удаление репозитория означает, что все теги, связанные с этим репо, будут удалены.
Удаление тега означает, что связь между изображением и тегом удалена.
Ни один из вышеперечисленных не удалит одно изображение. Они остались на вашем диске.
Временное решение
Для этого обходного пути вам нужно, чтобы ваши изображения докера хранились локально.
Обходным решением для вашего решения будет удаление всех тегов, кроме самых последних, и, следовательно, удаление ссылки на связанные изображения. Затем вы можете запустить этот скрипт, чтобы удалить все изображения, на которые не ссылаются ни теги, ни родословная какого-либо использованного изображения.
Терминология (изображения и теги)
Рассмотрим график изображения , как это , где заглавные буквы ( A
, B
, ...) представляют собой короткие идентификаторы изображений и <-
означает , что изображение на основе другого изображения:
A <- B <- C <- D
Теперь добавим теги к картинке:
A <- B <- C <- D
| |
| <version2>
<version1>
Здесь тег <version1>
ссылается на изображение, C
а тег <version2>
ссылается на изображение D
.
Уточнение вашего вопроса
В своем вопросе вы сказали, что хотите удалить
все изображения, кроме latest
, Теперь эта терминология не совсем верна. Вы смешали изображения и теги. Глядя на график, я думаю, вы согласитесь, что тег <version2>
представляет последнюю версию. На самом деле, согласно этому вопросу у вас может быть тег, который представляет последнюю версию:
A <- B <- C <- D
| |
| <version2>
| <latest>
<version1>
Поскольку <latest>
тег ссылается на изображение, D
я спрашиваю вас: вы действительно хотите удалить все, кроме изображения D
? Возможно нет!
Что произойдет, если вы удалите тег?
Если вы удалите тег <version1>
с помощью Docker REST API, вы получите следующее:
A <- B <- C <- D
|
<version2>
<latest>
Помните: Docker никогда не удалит изображение! Даже если это так, в этом случае он не может удалить изображение, так как изображение C
является частью предка для изображения, D
которое помечено.
Даже если вы используете этот скрипт , ни одно изображение не будет удалено.
Когда изображение может быть удалено
При условии, что вы можете контролировать, когда кто-то может вытянуть или протолкнуть ваш реестр (например, отключив интерфейс REST). Вы можете удалить изображение из графического изображения, если на нем нет другого изображения и на него нет ссылок.
Обратите внимание , что в следующем графике, то изображение D
будет не на основе , C
а на B
. Поэтому D
не зависит от C
. Если вы удалите тег <version1>
на этом графике, изображение C
не будет использоваться никаким изображением, и этот скрипт может удалить его.
A <- B <--------- D
\ |
\ <version2>
\ <latest>
\ <- C
|
<version1>
После очистки ваш граф изображений выглядит так:
A <- B <- D
|
<version2>
<latest>
Это то, что вы хотите?