Когда шлюз OpenClaw опирается на контейнерный рантайм, хост и образ должны согласовать, какой движок OCI отвечает на вызовы docker или podman, где лежат репозитории и кэши, и как навыки подтягивают зависимости. Флаг --container и переменная OPENCLAW_CONTAINER задают одну и ту же политику во всех оболочках, сервисах Compose и строках CI; при расхождении получаются «плавающие» ошибки, не воспроизводимые в тикете. Ниже — порядок режим → сокет → тома → навыки → doctor, затем короткий пример изолированного высокопамятного Mac в роли шлюза вне очереди runner. Связка с песочницей Docker и порядком validate см.
2026: обновление OpenClaw 2026.3.x и Docker-песочница — config validate, явный OPENCLAW_SANDBOX, нормализация setupCommand и миграция HTTP-маршрутов плагинов с doctor;
про смешанные установки brew/npm/Docker и сверку с doctor — в материале
OpenClaw SecretRef, аудит и doctor при смешанной установке.
1. Единый источник правды для --container и OPENCLAW_CONTAINER
В каждом окружении выберите одного «владельца» смысла: либо зафиксируйте OPENCLAW_CONTAINER=true|false в Compose и считайте CLI-флаг опциональным, либо стандартизуйте явные флаги в job и запретите тихие экспорты в профилях shell. Задокументируйте выбор в runbook дежурства: иначе инженер сменит только одну сторону, и половина toolchain останется на хостовом PATH. В GitHub Actions или Buildkite печатайте разрешённую пару в начале job и завершайте job с ошибкой при несовпадении — это дешевле, чем расследовать «у коллеги работает». Не смешивайте в одном PR смену режима контейнера с правками путей секретов или монтирования: откат должен оставаться однозначным.
2. Docker и Podman: сокеты, контексты и пропуск CLI
Смонтируйте корректный управляющий сокет и выставьте DOCKER_HOST или эквивалент Podman так, чтобы клиент внутри образа говорил с тем же демоном, что и smoke-тест на хосте. Docker Desktop на macOS часто прокидывает /var/run/docker.sock через лёгкую ВМ; rootless Podman использует пользовательский сокет с путём, зависящим от дистрибутива. Смешение клиента Podman с демоном Docker даёт «connection refused» без явной подсказки. Предпочтительны два именованных профиля Compose вместо symlink между сокетами. После любого переноса сокета выполните docker version или podman info из того же сетевого пространства имён, что и процесс шлюза. Если шлюз вызывает внешние образы registry, проверьте исходящие правила файрвола и корпоративного прокси отдельно для процесса демона и для контейнера: ошибка аутентификации в registry легко принимается за сбой OpenClaw, пока не сравните логи pull с хоста и изнутри сети сервиса.
3. Bind-mount: рабочая область, конфигурация, кэши и политика только чтение
Монтируйте workspace и состояние с явными путями на хосте, которые существуют до compose up. Политику и openclaw.json по возможности отдавайте только для чтения, чтобы плагины не переписали канонический файл. Разделяйте эфемерные кэши и долговечные очереди, чтобы задачи prune не сняли работу в полёте. Выровняйте UID/GID с пользователем контейнера; на macOS поведение bind-mount отличается от Linux CI, поэтому зафиксируйте в документации числовые идентификаторы, которые вы проверили. При ротации checkout обновляйте пути в Compose синхронно — устаревшие монтирования лидируют в списке ENOENT при запуске навыков.
4. Зависимости навыков: сначала образ, затем идемпотентный setupCommand
Тяжёлые пакеты и компиляторы переносите в слой образа, чтобы холодный старт оставался коротким. Для setupCommand оставьте только шаги с фиксированной semver, контрольными суммами или распаковкой архива — без интерактива и без цепочек cd, завязанных на домашний каталог неизвестной формы. Логируйте версии toolchain сразу после setup, чтобы дифф между релизами был одной строкой в журнале. Нативные заголовки и библиотеки держите в том же слое, что и компилятор; смешение пакетов между перезапусками контейнера порождает ошибки линковки, похожие на дефекты OpenClaw. Общие рантаймы вынесите в один скрипт, чтобы не качать одно и то же из каждого навыка. Для команд, которые тянут пакеты из частных индексов, пробрасывайте токены через механизмы секретов контейнера, а не через долгоживущие файлы в bind-mount рабочего каталога — иначе права на томе и утечки в снапшотах бэкапа станут отдельным классом инцидентов рядом с ошибками сборки.
5. doctor как сверка, а не случайная кнопка
Запускайте doctor после стабилизации сокетов и томов, иначе разбор уйдёт в «сетевые призраки». На инциденте придерживайтесь одного порядка: права и метки безопасности томов, доступность движка OCI, привязки шлюза и слушателей, плагины и таблица маршрутов, затем исходящий DNS, корпоративный TLS и HTTP-прокси. Сохраняйте вывод в тикет. Если doctor указывает на рассогласование режима контейнера или дубли маршрутов, исправьте конфигурацию, перезапустите doctor и только потом крутите уровень логов. Долгоживущий шлюз на macOS дополнительно сверяйте с материалом про launchd и порты.
- Совпадают ли
OPENCLAW_CONTAINERи флаг CLI во всех unit-файлах и job? - Тот же сокет, что проверяли smoke-тестом из сети контейнера?
- Скрипты установки навыков идемпотентны при перезапуске контейнера?
6. Пример: удалённый Mac с большим ОЗУ как изолированный шлюз
Выделите отдельный высокопамятный Mac за SSH или в tailnet: на нём — Compose, агент мониторинга и отгрузка логов; self-hosted runner для массовых PR держите на других метках, чтобы всплески сборок не отбирали память у шлюза. Используйте быстрый NVMe для слоёв образа и кэшей навыков, закрепите мажор Node как в проде, снимайте снапшот ОС после «зелёного» прогона doctor, ограничьте вход только bastion или mesh, ротируйте deploy-ключи через секреты CI. Вы меняете колокацию с пулом сборки на предсказуемую задержку до каналов и MCP-бэкендов и снижаете риск, что тяжёлый job сотрёт node_modules посреди рабочего дня шлюза. На такой ноде удобно держать и «канареечный» профиль Compose с теми же томами, что в проде, но с пониженным лимитом нагрузки: вы проверяете обновление образа и набор монтирований до переноса на основной шлюз, не затрагивая пользователей.
Почему для такого шлюза по-прежнему уместен класс Mac mini
Пропуск CLI в контейнер решает только часть задачи: хост должен месяцами оставаться стабильным при низком энергопотреблении. Apple Silicon на Mac mini даёт высокую пропускную памяти рядом с тихим корпусом; macOS сочетает привычный Unix-стек с Gatekeeper, SIP и FileVault — удобно для безнадзорного шлюза. В простое машина потребляет очень мало ватт, без вентиляторных сюрпризов ноутбука в режиме сна. Если нужен именно вынос шлюза на выделенное железо с крупным ОЗУ, откройте главную страницу Macstripe, сравните регионы и подберите конфигурацию Mac mini M4 под профиль памяти и диска.
Так вы связываете описанный контур Docker или Podman с железом, которое не требует постоянного ручного обслуживания и даёт предсказуемый I/O для демонов и сокетов. Если вы хотите закрепить этот runbook на компактной тихой машине с разумной совокупной стоимостью владения, Mac mini M4 — сильная стартовая точка; оформите выделенную облачную Mac-ноду на Macstripe и выведите шлюз из конкуренции с очередью CI.