Files
obsidian-vault/personal/tech/docker-mac-disk-issues.md
T

11 KiB
Executable File
Raw Blame History

Docker на Mac — проблема с диском и сборкой образов

Последнее обновление: 2026-09-29

2026-09-29: выполнена большая чистка, освобождено 41 ГБ (57 ГБ → 16 ГБ, 61% → 17%). Снесены balda-executor, watchtower, 16 неиспользуемых образов и buildkit-volume 37.71 ГБ. Полный разбор — §«✅ Чистка 2026-09-29» в конце дока. ⚠️ Цифры в §«Структура диска» ниже — снимок 2026-06-30 (17 ГБ / 8.4 ГБ кэша), оставлены как исторический ориентир. Актуальные размеры — в разделе про чистку.

Сетап

Параметр Значение
Движок Colima (не Docker Desktop!)
Гипервизор macOS Virtualization.Framework
Архитектура arm64
CPU 8 ядер
RAM 24 GiB
Диск VM 100 GiB (sparse)
Mount type virtiofs

Проблема: контейнеры (особенно Zulip) зависают во время сборки Docker образов для Валеры

Симптом: Zulip перестаёт отвечать на вебхуки, RabbitMQ паникует, PostgreSQL тормозит.

🔴 Реальный корень — переполнение диска VM (не CPU, не bind mount)

Структура диска Colima VM

/dev/vdb1 (98 GiB, data disk) хранит /var/lib/docker:

17 GB — /var/lib/docker (Colima data)
├── 8.2 GB — rootfs/overlayfs        ← слои всех образов
├── 8.9 GB — volumes
│   ├── 8.4 GB — buildx_buildkit_arm64builder0_state   ← 🔴 build cache volume
│   ├── 341 MB — zulip_zulip-pgdata
│   ├── 85 MB — dangling volume
│   ├── 46 MB — openclaw_postgres-data
│   └── 38 MB — zulip_zulip-data
└── остальное — containers, buildkit metadata

Build cache volume — 8.4 GB и не чистится сам

Docker BuildKit при использовании buildx хранит кеш слоёв в Docker volume, а не в overlayfs. Это volume buildx_buildkit_arm64builder0_state.

Почему не чистится:

  • docker system prune чистит только build cache records (метаданные), НЕ volume
  • BuildKit контейнер (moby/buildkit:buildx-stable-1) всегда running — volume считается активным
  • BuildKit GC policy не видит этот volume как «своё» хранилище (это Docker volume, не /var/lib/buildkit)
  • Без ручной очистки volume растёт с каждой сборкой и не уменьшается

Почему аффектит контейнеры:

  1. Каждая сборка Валеры добавляет новые слои в этот volume
  2. Volume растёт (8.4 GB и выше)
  3. Когда /dev/vdb1 заполняется >85-90%:
    • Docker overlayfs + containerd snapshotter начинают тормозить
    • Запись новых слоёв фейлится или идёт в разы медленнее
    • PostgreSQL и RabbitMQ WAL не могут закоммититься
    • RabbitMQ Khepri (Raft) при проблемах с WAL сбрасывает состояние (пользователи пропадают)
    • Zulip отдаёт 500 на /api/v1/register
    • Контейнеры тупят или падают в restart loop

Чистка build cache (безопасно — не трогает образы, контейнеры, volumes)

docker builder prune --all --force — удаляет только временный build cache (промежуточные слои сборок). Не затрагивает:

  • Образы (SDK, libs, рантаймы) — docker images не меняется
  • Контейнеры (запущенные и остановленные)
  • Volumes (включая БД)
  • Networks
# Полная очистка build cache
docker builder prune --all --force

При следующей сборке: если образ уже собран и его слои есть в overlayfs, BuildKit пересоберёт только то, что изменилось в Dockerfile. Базовые apt-get install / pip install придётся перевыполнить, если их слой был закэширован.

Щадящая чистка (оставляет свежий кэш <24h):

docker builder prune --filter 'until=24h' --force

Не полностью решает проблему — volume фрагментирован, место не reclaim-ится.

Чистка build cache volume (агрессивно — перекачка с нуля)

# Остановить buildkit контейнер, удалить volume, BuildKit пересоздаст при следующем билде
docker rm -f buildx_buildkit_arm64builder0
docker volume rm buildx_buildkit_arm64builder0_state

Мониторинг заполненности диска VM:

colima ssh -- df -h /dev/vdb1

Связанные документы

✅ Чистка 2026-09-29 — освобождено 41 ГБ

По команде Alex: снести неиспользуемые образы, balda-executor, watchtower, balda-теги старого стека и слои сборки.

Метрика До После
VM disk /dev/vdb1 57 ГБ (61%) 16 ГБ (17%)
Images 19.12 ГБ 15.71 ГБ
Build Cache 1.91 ГБ 1.62 ГБ
buildkit volume 37.71 ГБ удалён

🔴 Главное подтверждение из этого дока: docker builder prune НЕ чистит volume buildx_buildkit_arm64builder0_state — он оставался 37.71 ГБ после prune. Реально освободило только удаление контейнера + volume:

docker rm -f buildx_buildkit_arm64builder0
docker volume rm buildx_buildkit_arm64builder0_state

📌 Обратная сторона: docker builder ls → arm64builder0 теперь inactive. Следующая сборка пересоздаст volume с нуля — все закэшированные слои (apt/pip/go mod download) потеряны. Это ожидаемая цена, не дефект.

Что снесено (16 образов + 3 контейнера)

Контейнеры: balda-executor, watchtower, buildx_buildkit_arm64builder0.

Образ Размер
balda-executor:0.1.0 2.48 ГБ
obsidian-mcp-image:0.1.0 1.67 ГБ
balda-executor-mcp:0.2.0 249 МБ
balda-executor-mcp:0.1.0 231 МБ
containrrr/watchtower:latest 21.5 МБ
balda-mm:0.1.10 / 0.1.12 / 0.1.13-diag 3 × 78.7 МБ
caddy, curlimages/curl, eclipse-mosquitto, tagwriter, teddysun/xray, ubuntu:noble, alpine:3.20, alpine:latest ~0.9 ГБ

⚠️ Побочный эффект: Watchtower снят с Mac

Watchtower жил в compose-проекте infra (~/Docker/infra). Автообновление образов на Mac больше не работает. Обновлять вручную:

cd <compose-dir> && docker-compose pull && docker-compose up -d

📌 На Kraken Watchtower тоже есть — он там отдельная история (и сам провоцировал падение mm-postgres, см. personal/tech/kraken-docker-startup-order.md).

🔴 Питфолл: compose down НЕ удаляет образы

После docker-compose down контейнер уходит, а образ остаётся. Для полного сноса нужен отдельный docker rmi <image>. Именно так остались висеть balda-executor:0.1.0 (2.48 ГБ) и containrrr/watchtower:latest.

🔴 Питфолл: «unused image» по имени может быть тем же ID, что running

obsidian-mcp-image:0.1.0 и obsidian-mcp-obsidian-mcp:latest — разные образы (разные ID), первый был артефактом сборки. Но у budget-* / fast-rlm-* / zulip-router тег :latest — тот же ID, что у безымянного образа, используемого контейнером. Удаление такого тега безвредно (слои остаются), но проверять ID, а не имя.

Бэкап перед чисткой

/Users/admin/.hermes/hermes-whale/backups/20260929-121946-docker-cleanup/

  • balda-executor/ — Dockerfile, compose.override.yaml, docker-compose.yml, agents-mounts.yaml, tools/
  • infra/ — docker-compose.yaml (где был watchtower)

Осталось (не снесено, осознанно)

balda-mm:0.1.13, 0.1.14, 0.1.15-pr8-5360e90b, 0.1.15-pr8-5360e90b-runtime210, 0.1.15-pr8-0e6d63aa-runtime210, balda:mm-classifier (~560 МБ) — ветки нового стека, который готовится. Снос — по отдельной команде.

⚠️ Текущий рабочий образ на Kraken: balda-mm:0.1.15-pr8-480ec821-runtime210 (на Mac его нет).

Живые контейнеры (16, все рабочие)

zulip-zulip-1  zulip-database-1  zulip-rabbitmq-1  zulip-memcached-1  zulip-redis-1  zulip-router
firecrawl-api-1  firecrawl-playwright-service-1  firecrawl-rabbitmq-1  firecrawl-redis-1
budget-backend  budget-frontend  obsidian-mcp  asana-mcp  fast-rlm-mcp  portainer

Не тронуто: 14 volumes (719 МБ — БД Zulip/Postgres), сеть balda_default, папки кода ~/Developer/balda, ~/Docker/balda-agent, ~/docker/balda-executor, ~/Docker/infra.

Apple Container — потенциальная замена Colima

Apple Container (apple/container, Apache 2.0, v1.0.0, Jun 9 2026) — нативная Swift-утилита для Linux контейнеров на macOS 26. VM-per-container через Virtualization.framework (не shared-kernel). OCI-совместима, pull/push с любых registry.

Не заменяет Colima сейчас — нет compose, нет buildx. При появлении compose-аналога может решить проблему build cache принципиально (архитектура VM-per-container не имеет одного volume, где всё гниёт).

Пока — следить за релизами. personal/documents/deferred-tasks