"No space left on device" - коли Docker з'їв весь диск

Обкладинка допису:  "No space left on device" - коли Docker з'їв весь диск
ЗмістНатисність на посилання, щоб перейти до потрібного місця
Деплоїш додаток на Coolify, білд проходить успішно… і раптом на етапі експорту образу:
ERROR: failed to extract layer sha256:...
write /var/lib/containerd/.../File/dirname-c.ri: no space left on device
Білд зібрався, але образ нікуди записати - диск заповнений.

🤔 Чому так стається

Docker накопичує сміття з кожним деплоєм:
  • Старі образи - кожен білд створює новий образ, старі залишаються
  • Build cache - проміжні шари збірки ніколи не видаляються автоматично
  • Зупинені контейнери - невидалені контейнери від попередніх деплоїв
  • Невикористані volumes - залишки від видалених сервісів
На невеликому сервері (4–8 GB диску) це може забити диск за кілька тижнів активної розробки.
Особливо якщо ви тримаєте Rails + Sidekiq + Redis + Elasticsearch.

🔎 Діагностика

Перевірити стан диску:
df -h
Подивитись, скільки займає Docker:
docker system df
Зазвичай ви побачите десятки гігабайт у розділі Images або Build Cache.

🛠 Фікс

docker system prune -a --volumes
Ця команда видаляє:
  • Всі зупинені контейнери
  • Всі мережі, які не використовуються
  • Всі образи без активних контейнерів
  • Весь build cache
  • Всі volumes без активних контейнерів (--volumes)

⚠️ Увага

--volumes видалить і дані у volumes.
Якщо ваша база (PostgreSQL / MySQL) працює через Docker volume без зовнішнього бекапу - спершу зробіть дамп.

🧼 Профілактика

Щоб не потрапляти в цю ситуацію регулярно:
Додати cron для автоматичного очищення
Щотижня о 3:00 ночі (без volumes, щоб не зачепити БД):
0 3 * * 0 docker system prune -af
Збільшити диск
Якщо ви запускаєте:
  • Rails
  • Elasticsearch
  • Redis
  • Sidekiq
4 GB диску - замало.
Комфортний мінімум: 20-40 GB.
Обмежити build cache
docker builder prune --keep-storage 2GB
Це дозволяє зберігати кеш, але не дасть йому розростися безконтрольно.
Якщо деплой падає з no space left on device - це не баг додатку.
Просто Docker накопичив занадто багато старих даних.
Одна команда:
docker system prune -a --volumes
вирішує проблему за секунди.
Але краще налаштувати автоматичне очищення, щоб не згадувати про це під час чергового релізу 

Цей допис поки що не має жодних доповнень від автора/ки.

22 лист., 12:49

Що таке VACUUM у PostgreSQL?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Що таке B-Tree (Balanced Tree)?
22 лист., 12:58

Що таке B-Tree (Balanced Tree)?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Фікс проблеми встановлення Ruby 3.4.3 (і не тільки) через RVM на macOS (Apple Silicon)
30 груд., 14:05

Фікс проблеми встановлення Ruby 3.4.3 (і не тільки) через RVM на macOS (Apple Silicon)

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Thundering Herd Problem: що це таке і чому він ламає продакшен
15 січ., 10:14

Thundering Herd Problem: що це таке і чому він ламає продакшен

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Що таке Exponential Backoff і Random Jitter?
15 січ., 15:24

Що таке Exponential Backoff і Random Jitter?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Підключення сервісу Elasticsearch до Rails-додатку (Coolify у хмарі, сервер на Hetzner).
15 лют., 13:45

Підключення сервісу Elasticsearch до Rails-додатку (Coolify у хмарі, сервер на Hetzner).

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
15 лют., 20:03

Sidekiq 7.3.x та connection_pool 3.0 - несумісність, яка ламає воркери

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska