CLI AI

Docker съел диск: как вернуть место

2026-05-13

/var/lib/docker растёт, пока не станет главной проблемой диска. Лечится одной командой, но запуск вслепую — это ровно то, как люди сносят базовый образ, на котором собирались собираться. Сначала посмотреть, потом чистить.

1. Понять, куда ушло место

clai
$ 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
$ clai удали остановленные контейнеры, висячие образы и неиспользуемые сети→ docker system prune

Обычный prune забирает остановленные контейнеры, висячие образы (слои, у которых не осталось тега), неиспользуемые сети и кэш сборки. Образы с тегами и тома не трогает. Эту команду можно запускать не задумываясь.

3. Агрессивная уборка

clai
$ clai удали все образы, которые не использует ни один запущенный контейнер→ docker system prune -a⚠ CAUTION — удалит каждый образ, не занятый запущенным контейнером

Флаг -a расширяет понятие «неиспользуемый» с без тега до не занят прямо сейчас работающим контейнером. Ваш бережно скачанный базовый образ на 4 ГБ считается неиспользуемым, если сейчас ничего не запущено, — качать заново на следующей сборке.

4. Тома: место, которого никто не ждёт

clai
$ clai покажи тома docker, которые не использует ни один контейнер→ docker volume ls -qf dangling=true

Prune по умолчанию обходит тома стороной, и намеренно — там живут базы данных. Сначала посмотрите список, узнайте имена и только потом решайте. docker volume prune удаляет данные, у которых по определению нет бэкапа.

5. Только кэш сборки

clai
$ clai почисти кэш сборки docker старше недели→ docker builder prune --filter 'until=168h'

На CI-машине это обычно самый крупный и самый безопасный выигрыш. --filter until= оставляет свежие слои, так что следующая сборка всё ещё быстрая.

6. Чтобы не повторилось

clai
$ 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 отсортирует их.

Читайте также

CliAI помечает prune -a как CAUTION и спрашивает перед запуском — потому что разница между двумя prune это 20 ГБ повторных загрузок. Установка одной строкой.