Траблшутинг утечек диска в Docker: docker system prune и dangling layers
- Ошибка
no space left on deviceпри создании новых контейнеров или сборке образов. - Каталог
/var/lib/docker/overlay2занимает сотни гигабайт дискового пространства. - Разрастание JSON-файлов логов контейнеров в каталоге
/var/lib/docker/containers/. - Накопление неиспользуемых anonymous volumes и кэша Docker BuildKit.
1. Анализ потребления дискового пространства Docker
docker system df -v2. Глубокая очистка неиспользуемых ресурсов
Удаление всех остановленных контейнеров, неиспользуемых сетей, висячих (dangling) слоев и кэша сборщика:
docker system prune -a --volumes -f3. Ограничение размера логов в /etc/docker/daemon.json
Предотвратите бесконечное разрастание логов контейнеров, настроив ротацию драйвера json-file:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "50m",
"max-file": "3"
}
}Перезапустите демон:
systemctl restart docker4. Автоматизированный скрипт очистки по расписанию
Создайте файл /etc/cron.weekly/docker-cleanup:
#!/usr/bin/env bash
set -euo pipefail
# Очистка образов старше 168 часов (7 дней) и dangling build cache
docker image prune -a --force --filter "until=168h"
docker builder prune -a --force --filter "until=168h"
docker volume prune -fchmod +x /etc/cron.weekly/docker-cleanup Частые вопросы (FAQ)
Почему после docker system prune размер папки /var/lib/docker/overlay2 не уменьшился?
Файлы overlay2 принадлежат работающим контейнерам. Если контейнер активно пишет временные файлы в свой root-слой вместо volume или tmpfs, место освободится только после его пересоздания.
Опасно ли выполнять команду docker volume prune?
Команда удаляет ВСЕ тома, которые в данный момент не примонтированы к работающим или остановленным контейнерам. Если у вас есть резервные отвязанные тома с базами данных, они будут стерты безвозвратно.