/var/lib/docker растёт, пока не станет главной проблемой диска. Лечится одной командой, но запуск вслепую — это ровно то, как люди сносят базовый образ, на котором собирались собираться. Сначала посмотреть, потом чистить.
1. Понять, куда ушло место
$ clai покажи, сколько места занимает docker и сколько можно освободить→ docker system dfTYPE TOTAL ACTIVE SIZE RECLAIMABLEImages 47 13 28.88GB 20GB (69%)Containers 16 9 126.8MB 513.8kB (0%)Local Volumes 38 7 6.311GB 4.084GB (64%)Build Cache 181 0 0B 0B
Читайте колонку RECLAIMABLE раньше всего остального. Здесь проблема — образы, на втором месте тома, контейнеры вообще шум.
2. Безопасная уборка
$ clai удали остановленные контейнеры, висячие образы и неиспользуемые сети→ docker system prune
Обычный prune забирает остановленные контейнеры, висячие образы (слои, у которых не осталось тега), неиспользуемые сети и кэш сборки. Образы с тегами и тома не трогает. Эту команду можно запускать не задумываясь.
3. Агрессивная уборка
$ clai удали все образы, которые не использует ни один запущенный контейнер→ docker system prune -a⚠ CAUTION — удалит каждый образ, не занятый запущенным контейнером
Флаг -a расширяет понятие «неиспользуемый» с без тега до не занят прямо сейчас работающим контейнером. Ваш бережно скачанный базовый образ на 4 ГБ считается неиспользуемым, если сейчас ничего не запущено, — качать заново на следующей сборке.
4. Тома: место, которого никто не ждёт
$ clai покажи тома docker, которые не использует ни один контейнер→ docker volume ls -qf dangling=true
Prune по умолчанию обходит тома стороной, и намеренно — там живут базы данных. Сначала посмотрите список, узнайте имена и только потом решайте. docker volume prune удаляет данные, у которых по определению нет бэкапа.
5. Только кэш сборки
$ clai почисти кэш сборки docker старше недели→ docker builder prune --filter 'until=168h'
На CI-машине это обычно самый крупный и самый безопасный выигрыш. --filter until= оставляет свежие слои, так что следующая сборка всё ещё быстрая.
6. Чтобы не повторилось
$ clai ограничь логи контейнеров десятью мегабайтами и тремя файлами→ sudo tee /etc/docker/daemon.json <<'EOF'{"log-driver":"json-file","log-opts":{"max-size":"10m","max-file":"3"}}EOF
У логов контейнеров по умолчанию нет ротации. Это одна настройка, которая предотвращает самый частый рецидив. Действует на контейнеры, созданные после перезапуска демона.
Грабли
prune -aпри выключенном стеке удаляет всё. «Используется» здесь означает есть запущенный контейнер, а не образ, который вам дорог. Сначала поднимите стек или возьмите--filter 'until=720h'.- На Docker Desktop prune не уменьшает полный диск. В macOS и Windows образ диска виртуалки не отдаёт место хосту автоматически.
- Удалённый том исчез навсегда. Корзины нет. Перед чисткой томов — бэкап, каждый раз.
Похожие вопросы
Чем docker system prune отличается от docker image prune -a? system prune за один проход берёт контейнеры, сети, образы и кэш сборки; image prune -a трогает только образы, зато удаляет и те, что с тегами.
Почему /var/lib/docker/overlay2 такой большой? Это слои образов и контейнеров. Не удаляйте оттуда ничего руками — метаданные лежат в другом месте, и вы просто разрушите хранилище образов. Только prune.
Как посмотреть, какой образ самый большой? docker image ls --format '{{.Size}}\t{{.Repository}}:{{.Tag}}' | sort -rh отсортирует их.
Читайте также
- Docker и Kubernetes: мышечная память — на пенсию
- df говорит, что диск полон, du — что нет
- Подчистить старые логи и бэкапы одной фразой
CliAI помечает prune -a как CAUTION и спрашивает перед запуском — потому что разница между двумя prune это 20 ГБ повторных загрузок. Установка одной строкой.