Docker корисний, але з часом з'їдає гігабайти: старі образи, зупинені контейнери, кеши білда. Ручне прибирання працює рівно до того моменту, коли місце раптово закінчується у продакшені. Тож автоматизуємо регулярну очистку місця на диску у середовищі Docker на Linux за допомогою systemd timers і акуратного bash-скрипта. ⏰🧹
Покажу безпечну схему з «сухим запуском» (dry-run), можливістю виключати важливі ресурси за лейблами та логуванням у journal. Це проста й надійна автоматизація задач без залежності від зовнішніх інструментів, а також гарна альтернатива cron (про cron та systemd timers теж поговоримо).
How-to: автоматичне очищення через systemd timer
Крок 1. Перевірка доступу до Docker
Скрипт має виконуватися від root або користувача з правами доступу до Docker-сокета (член групи docker). Швидка перевірка:
Якщо помилка «permission denied», або запускайте від root (через sudo), або додайте користувача в групу docker і перелогіньтесь:
Крок 2. Створюємо bash-скрипт прибирання
Скрипт прибирає зупинені контейнери, старі (невикористані) образи, кеш білда і опційно — не використані томи. Є підтримка dry-run, агресивного режиму (-a для образів) і виключень за лейблом keep=true.
Порада: позначайте важливі ресурси лейблом keep=true, щоб скрипт їх не чіпав. Наприклад:
Крок 3. systemd service + timer
Створимо сервіс для одноразового запуску та таймер для планування.
За потреби змініть параметри середовища в .service (наприклад, DAYS=30, AGGRESSIVE=true). Також можна разово виконати «сухий» запуск:
Альтернативні способи
Через cron (якщо не використовуєте systemd)
Хоч я і раджу systemd timers за надійність і Persistency, cron теж працює:
Один рядок для разового прибирання
GUI-спосіб (Portainer)
Якщо любите кліки, поставте Portainer та чистіть ресурси з веб-інтерфейсу:
Далі відкрийте https://SERVER:9443 → Home → Ваш Docker → Images/Containers/Volumes → Cleanup/Prune. У CE-версії розкладу немає, але для ручного керування це зручно.
FAQ
Чим відрізняється docker system prune від image/container prune?system prune підчищає все одразу (контейнери, образи, мережі, кеш), але має менше тонких фільтрів. Окремі prune-команди дають більше контролю (лейбли, часові фільтри).
Чи безпечно ставити -a для образів?
Так, якщо впевнені, що образи не використовуються контейнерами. -a видаляє всі невикористані образи (не лише dangling). Для консервативного режиму залиште без -a.
Як виключити важливі ресурси?
Додавайте лейбл keep=true (контейнери: --label keep=true, образи: LABEL keep=true у Dockerfile). Скрипт фільтрує label!=keep=true.
Що таке Persistent=true у таймері?
Якщо сервер був вимкнений під час запланованого запуску, systemd виконає пропущене завдання при наступному старті.
Чи працює це з rootless Docker?
Так, якщо таймер і сервіс запущені від того ж користувача, що володіє rootless-сесією Docker (user-level systemd).
Чи торкнеться це Docker Compose?
Ні, працюючі контейнери не чіпаються. Образи, що використовуються контейнерами, також не видаляються (навіть у режимі -a).
Що робити, якщо місце вже закінчилось?
Швидке прибирання: зупинені контейнери + dangling-образи:
Потім увімкніть планове прибирання за інструкцією вище.
Як вимкнути/видалити таймер?sudo systemctl disable --now docker-autoclean.timer, за потреби видаліть файли сервісу/таймера та зробіть daemon-reload.
Порада від Kernelka
Почніть із DRY_RUN=true, перегляньте лог (journalctl -u docker-autoclean.service), і лише потім вимикайте dry-run. Для прод-серверів раджу запуск у непіковий час і з RandomizedDelaySec, щоб хмара не «хуртовинила» I/O одночасно. Для особливо чутливих ворклоадів використовуйте лейбли keep=true скрізь, де потрібно гарантувати збереження.
Підсумок
- Ми налаштували systemd timer і bash-скрипт для регулярного прибирання Docker-ресурсів.
- Підтримані dry-run, агресивний режим і виключення за лейблами.
- Це надійна автоматизація задач, краща за cron для більшості серверів.
- Регулярна очистка зменшує ризики простоїв через заповнений диск.
- За потреби доступний ручний і GUI-підхід (Portainer).

Прокоментувати
На сайті відображається лише твоє ім'я та коментар. Електронна пошта зберігається виключно для зв'язку з тобою за потреби та в жодному разі не передається стороннім особам.