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

237 lines
13 KiB
Markdown
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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
```bash
# Полная очистка build cache
docker builder prune --all --force
```
При следующей сборке: если образ уже собран и его слои есть в overlayfs, BuildKit пересоберёт только то, что изменилось в Dockerfile. Базовые `apt-get install` / `pip install` придётся перевыполнить, если их слой был закэширован.
**Щадящая чистка** (оставляет свежий кэш <24h):
```bash
docker builder prune --filter 'until=24h' --force
```
Не полностью решает проблему — volume фрагментирован, место не reclaim-ится.
### Чистка build cache volume (агрессивно — перекачка с нуля)
```bash
# Остановить buildkit контейнер, удалить volume, BuildKit пересоздаст при следующем билде
docker rm -f buildx_buildkit_arm64builder0
docker volume rm buildx_buildkit_arm64builder0_state
```
Мониторинг заполненности диска VM:
```bash
colima ssh -- df -h /dev/vdb1
```
### Связанные документы
- [[tech/docker_colima_setup]] — установка и автостарт Colima
- [[projects/balda/setup]] — Balda агенты (Валера, Клавдий)
- [[how-to/hermes-eagle-mac]] — Hermes на Mac, Zulip Docker стек (RabbitMQ pitfall про Khepri)
- [[how-to/openmediavault-rpi5]] — build cache на RPi (та же проблема ENOSPC)
- [[plans/zulip-decommission]] — план сноса Zulip с сохранением истории
- [[tech/zulip-message-history]] — история переписки в SQLite (для поиска)
## ✅ Чистка 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:
```bash
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 больше не работает.** Обновлять вручную:
```bash
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-*`, `balda:mm-classifier` (~560 МБ)~~
✅ **Снесены вторым заходом 2026-09-29.** Alex: «ветки сноси, там щас новый релиз будет,
пересобирать будем всё».
Снесено: `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`.
**На Mac balda-образов не осталось** — чистое поле под новый релиз.
```bash
# Проверка перед сносом (обязательно): ни один живой контейнер не использует образ
docker ps --format '{{.Names}} {{.Image}}' | grep -i balda # → пусто
```
### Итог чистки 2026-09-29
| Метрика | До | После |
|---|---|---|
| **VM disk `/dev/vdb1`** | **57 ГБ (61%)** | **16 ГБ (17%)** |
| Images | 44 шт / 26.45 ГБ | 19 шт / 15.27 ГБ |
| Containers | 22 | 16 |
| Build Cache | 8.63 ГБ | 1.62 ГБ |
| buildkit volume | 37.71 ГБ | удалён |
**Освобождено суммарно ≈ 41.6 ГБ.**
### Готовность к сборке нового релиза
- ✅ `arm64builder` пересоздастся сам при первой сборке (сейчас `inactive`)
- ✅ Кэш слоёв пуст — сборка пойдёт с нуля (apt/pip/go mod download заново)
- ✅ Старых тегов нет — коллизий имён не будет
- ⚠️ Сборка: `docker-compose build --no-cache` либо `docker buildx build --builder arm64builder --platform linux/arm64 --provenance=false --load`
⚠️ **На Kraken ничего не снесено** — там `balda-executor-mcp` работает,
текущий рабочий образ `balda-mm:0.1.15-pr8-480ec821-runtime210`.
> 📌 **2026-09-29 (позже в тот же день):** история Zulip выгружена в SQLite и
> Zulip готовится к сносу — см. [[tech/zulip-message-history]] и
> [[plans/zulip-decommission]]. Контейнеры `zulip-*` из списка ниже — кандидаты на удаление.
### Живые контейнеры (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]]