0% прочитано

Docker Build Cache зайняв майже 30 GB: як я знайшла, що з'їло диск

Під час локального запуску AVN Documentation AI мій диск майже закінчився. Docker Build Cache виріс приблизно до 29 GB, images займали ще понад 31 GB, а filesystem дійшов до 99-100%. Показую, як я знайшла причину, чому звичайний prune майже не допоміг і як контрольовано звільнила десятки гігабайтів.

10 вересня 2026 р. 10 хв читанняDocker

Я просто хотіла локально запустити AVN Documentation AI, але замість звичайного Docker troubleshooting побачила значно цікавішу проблему: на диску майже не залишилося місця.

Filesystem дійшов до 99-100% використання, а в окремих замірах залишалося лише приблизно 1.4-3.5 GB вільного простору.

Коли я відкрила Docker statistics, найбільше мене здивував Build Cache: майже 29 GB.

Це не історія про те, що один AI-проєкт створив 29 GB кешу за один запуск. Локальний запуск просто допоміг виявити Docker cache, який уже накопичувався в моєму development environment.
Docker build cache disk usage before and after controlled cleanup
Docker Build Cache майже 29 GB став головною причиною, яку я побачила після перевірки disk usage і docker system df.

Перший симптом - диск майже заповнений

Проблема проявилася не як Docker error про cache.

Я побачила звичайний системний симптом: filesystem майже повний.

Тому перша перевірка була не prune, а вимірювання.

BASH - Перевірити вільне місце
df -h /
Один із зафіксованих станів filesystem
Filesystem      Size  Used Avail Use%/dev/...        230G  215G  3.5G  99%

Пізніше під час роботи available space падав ще нижче - приблизно до 1.4 GB, а filesystem показував 100% usage.

У такому стані вже немає сенсу навмання видаляти project files. Спочатку потрібно зрозуміти, хто саме займає місце.

docker system df одразу показав масштаб

BASH - Показати використання диска Docker
docker system df
Docker disk usage
TYPE            TOTAL SIZE   RECLAIMABLE Images          31.19 GB     12.46 GBLocal Volumes    1.063 GB     661.6 MBBuild Cache     28.54 GB     16.95 GB

Цей output одразу змінив напрямок troubleshooting.

Volumes займали близько 1 GB, тобто вони явно не були головною причиною.

Images займали понад 31 GB, але найбільш неочікуваним для мене був Build Cache майже 29 GB.

Docker storage

Total

Reclaimable

Images

31.19 GB

12.46 GB

Local Volumes

1.063 GB

661.6 MB

Build Cache

28.54 GB

16.95 GB

Docker cache може бути більшим за весь мій expectation

До цього моменту я сприймала Docker build cache як щось тимчасове і відносно невелике.

Насправді BuildKit може зберігати layers і build records між великою кількістю builds, щоб наступні збірки були швидшими.

Якщо Docker використовується щодня в кількох проєктах, cache може непомітно вирости до десятків гігабайтів.

Reclaimable не означає, що потрібно негайно видаляти все. Спочатку потрібно зрозуміти різницю між images, volumes і build cache та вирішити, що безпечно очищати саме у вашому environment.

Перший обережний prune майже не змінив ситуацію

Я не хотіла одразу використовувати максимально агресивне очищення.

Спочатку спробувала звичайне очищення unused build cache.

BASH - Обережно очистити dangling build cache
docker builder prune

Але результат виявився значно меншим, ніж я очікувала.

Після цього Build Cache все ще залишався приблизно на рівні 28.33 GB, з яких близько 16.85 GB Docker продовжував показувати reclaimable.

Після першого cleanup
Build Cache:28.33 GB total16.85 GB reclaimable Available disk:about 2.3 GB

Чому звичайний builder prune не прибрав усе

docker builder prune за замовчуванням працює консервативніше і прибирає dangling build cache.

Але значна частина unused cache може все ще залишатися доступною для повторного використання.

Тому команда може відпрацювати успішно, а десятки гігабайтів усе одно залишаться на диску.

Наступним кроком я обмежила aggressive cleanup за часом

Перед наступним очищенням стан був уже критичним.

У зафіксованому snapshot було близько 1.4 GB available, а Build Cache виріс приблизно до 29.22 GB.

Тому я використала -a, але не хотіла бездумно знищувати весь cache.

BASH - Очистити unused build cache старше 7 днів
docker builder prune -a \  --filter "until=168h"
Опція -a розширює cleanup за межі dangling cache і може видалити unused build cache, який прискорював майбутні builds. Після цього деякі Docker layers доведеться побудувати або завантажити знову.

Результат був дуже помітним

До
text
Available disk:1.4 GB Build Cache:29.22 GB total17.73 GB reclaimable
Після
text
Available disk:24 GB Build Cache:11.59 GB total0 B reclaimable

Build Cache зменшився приблизно з 29.22 GB до 11.59 GB.

Це близько 17.6 GB build cache, які більше не займали диск.

А filesystem замість критичних 1.4 GB available вже показував приблизно 24 GB вільного місця.

Metric

Before

After

Build Cache

29.22 GB

11.59 GB

Reclaimable Build Cache

17.73 GB

0 B

Available disk

1.4 GB

24 GB

Чому Docker Build Cache взагалі так росте

  • Кожен Docker build може створювати нові reusable layers.
  • Зміни в Dockerfile або build context можуть invalidувати попередні layers.
  • Dependency installation часто створює великі cached build stages.
  • Робота з кількома проєктами накопичує cache незалежно для різних build graphs.
  • Multi-stage builds можуть залишати cache для intermediate stages.
  • BuildKit спеціально зберігає reusable data, тому швидкість build отримується ціною disk space.

Сам cache не є проблемою. Він існує саме для того, щоб Docker не повторював однакову роботу на кожному build.

Проблема починається тоді, коли вартість кешу на диску стає більшою за користь від прискорення build.

AI-проєкт був тригером, а не обов'язково єдиною причиною

Я помітила проблему під час запуску AVN Documentation AI, але було б неправильно сказати, що саме цей проєкт сам створив усі 29 GB.

На машині вже існували інші Docker і Laradock environments, PHP versions, images та попередні builds.

Новий AI workflow просто довів disk usage до точки, де накопичення стало видимим.

Images, Build Cache і Volumes - це різні речі

Storage

Що це

Що станеться після cleanup

Images

Готові image layers

Image може знадобитися завантажити або build знову

Build Cache

Reusable build layers і records

Наступний build може стати повільнішим

Volumes

Persistent container data

Можлива втрата database або application data

Volumes я не очищаю просто тому, що закінчується disk space. На відміну від build cache, volume може містити реальні persistent data - наприклад локальну database.

Команди prune мають різний scope

Command

Scope

docker builder prune

Dangling build cache

docker builder prune -a

All unused build cache

docker image prune

Unused image data залежно від options

docker system prune

Більш широкий cleanup кількох Docker resource types

Саме тому я не починала з docker system prune.

Коли docker system df уже показує, що головний кандидат - Build Cache, краще чистити конкретний resource type, а не все підряд.

Що я б не робила при заповненому диску

  • Не запускала б docker system prune -a автоматично, не подивившись docker system df.
  • Не видаляла б volumes без перевірки їх content.
  • Не припускала б, що найбільше місця завжди займають images.
  • Не вважала б successful builder prune доказом, що cache тепер маленький.
  • Не очищала б cache перед важливим build, якщо немає часу повторно завантажувати dependencies.
  • Не плутала б Docker build cache з model cache або application cache.

Після cleanup є прихована ціна

Звільнені 17+ GB виглядають як безкоштовний виграш, але Docker cache існував не просто так.

Після aggressive prune наступний build може знову виконати dependency installation, compilation або download layers.

Я обміняла disk space на потенційно довший наступний build. У ситуації з filesystem на 100% це був правильний trade-off.

Окремо був ще cache AI models

Docker був не єдиним cache на машині.

Для локального AI environment окремий model cache займав приблизно 2.3 GB.

Це ще раз показало, що Docker cache, model cache і project data потрібно вимірювати окремо, а не називати все просто "Docker займає диск".

BASH - Перевірити локальний AI model cache
du -sh ~/.cache/avndai-tei
TEI model cache
2.3G    ~/.cache/avndai-tei

До цього я вже багато працювала з Docker через Laradock, кількома PHP runtimes і private Composer dependencies.

Наприклад, окремо описувала multi-PHP workflow у Laradock та кейс із Composer, GitLab і Docker SSH agent.

Але саме цей випадок змусив мене додати до Docker workflow ще одну регулярну перевірку - disk usage.

Мій короткий Docker disk checklist

  • Спочатку перевірити filesystem через df -h.
  • Подивитися Docker breakdown через docker system df.
  • Визначити, що саме росте: images, build cache чи volumes.
  • Починати з найбільш вузького cleanup command.
  • Використовувати -a тільки коли розумію його scope.
  • За можливості обмежувати aggressive cleanup filter за часом.
  • Після cleanup повторити і df -h, і docker system df.
  • Пам'ятати, що очищений cache може зробити наступний build повільнішим.

Найбільше мене вразило не те, що Docker займав десятки гігабайтів. Мене вразило, що майже 30 GB з них були Build Cache, про який я взагалі не думала, поки диск не закінчився.

Що я залишила собі на майбутнє

  • Не чекати 99% disk usage, щоб подивитися docker system df.
  • Вважати Build Cache повноцінним споживачем disk space.
  • Не плутати reclaimable із автоматично safe-to-delete.
  • Чистити конкретний Docker resource, якщо причина вже відома.
  • Не торкатися volumes без окремої перевірки.
  • Після aggressive prune очікувати повільніший cold build.
  • Окремо контролювати AI model caches та інші non-Docker caches.

Висновок

Docker Build Cache цілком реально може вирости до десятків гігабайтів.

У моєму випадку він наблизився до 30 GB, поки filesystem уже стояв на межі 100% usage.

docker system df допоміг відділити build cache від images і volumes, а контрольований docker builder prune -a --filter "until=168h" прибрав приблизно 17.6 GB старого unused cache.

Найважливіший урок для мене - не починати Docker cleanup із видалення. Спочатку виміряти, потім зрозуміти resource type, і тільки після цього чистити саме те, що справді створює проблему.