Существуют ли передовые практики и / или инструменты для регулярной очистки старых образов Docker?


13

Существует ли элегантный способ или лучший метод удаления старых изображений из реестра Docker?

Я вижу много запросов / проблем здесь: https://github.com/docker/docker-registry/labels/delete , но не нашел хорошего / популярного решения для этого.

Итак, есть ли инструмент или техника, которая поможет мне сделать это?

Кроме того, есть ли лучшие практики, которым вы следуете, делая это?


2
Вы спрашиваете, как почистить реестр? (Какую ссылку и вопрос вы предоставляете), но принятый ответ - не очистка реестра, а очистка вашего локального докера.
Далоре

Ответы:


10

Мне повезло с Spotify / docker-gc . Он может быть запущен из cron или как контейнер Docker.

Простой Docker-контейнер и скрипт для сборки мусора изображений.

  • Контейнеры, вышедшие более часа назад, удаляются.
  • Изображения, которые не принадлежат ни одному оставшемуся контейнеру после этого, удаляются.

2
На первый взгляд, похоже, что за всем этим стоит более или менее подмножество однострочников из ответа @rombob. Это правда, или есть какой-то «интеллект», в docker-gcкотором я скучаю?
AnoE

1
Оператор ссылки и задает вопрос о том, как очистить из реестра, но docker-gc не очищает из реестра, он просто очищает с вашего локального компьютера. Я предполагаю, что OP действительно спрашивал, как убрать на месте
dalore

Страница Docker-gc теперь рекомендует использовать docker system pruneвместо этого. Но я не нашел, как исключить некоторые изображения из чернослива Докера. Есть ли способ исключить некоторые изображения с docker system prune?
Александр Артеменко

9

Не могу назвать это лучшей практикой, но это то, что мы используем, запускаемые cron, рады видеть лучшие предложения.

echo "safely removing untagged images"
docker rmi $(docker images | awk '/<none>/{print $3}')

echo "safely removing stopped containers"
docker rm $(docker ps -a -q)

echo "safely removing old containers"
docker ps -a | awk '/weeks ago|months ago|days ago/{print $1}' | xargs --no-run-if-empty docker rm

echo "safely removing old images"
docker images | awk '/weeks ago|months ago|days ago/{print $3}' | xargs --no-run-if-empty docker rmi

echo "safely removing old volumes, custom rebuild of martin/docker-cleanup-volumes image"
docker run -v /var/run/docker.sock:/var/run/docker.sock -v $(readlink -f /var/lib/docker):/var/lib/docker --rm example/docker-cleanup-volumes

echo "native cleanup Docker => 12"
docker system prune -f

Пожалуйста, не связывайте grep и awk, сделайте тот же фильтр непосредственно перед командой awk `regex {command}`
Tensibai

1
@Tensibai что-нибудь, чтобы сделать волшебников AWK счастливыми :)
rombob

На всякий случай, это не просто педантично, вы сохраняете процессное порождение и большую кучу изменений контекста :) Здесь ничего не меняется, но любой повод отстаивать это хорошо :)
Tensibai

@Tensibai определенно, хорошие привычки окупаются со временем, порождение стоит нам времени и денег :)
Ромбоб

Особенно, когда вы анализируете / форматируете миллиарды строк лог-файлов, чтобы подготовиться к вводу R :) Здесь я не ожидаю более нескольких десятков строк.
Тенсибай

4

На моем локальном компьютере (Mac) у меня есть небольшой скрипт, который я периодически запускаю, который очищает все лишние изображения до clean-docker-for-mac.sh

Для моих серверов я запускаю meltwater / docker-cleanup, который периодически очищает вышедшие контейнеры и удаляет изображения и тома, которые не используются.

Я использую множество разных образов Docker для своей работы над Codemason, и мне нужны такие скрипты. Наслаждайтесь!


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.