Container machine — новая штука от команды container (кажется, это проект от создателей WhatCable? но в статье не уточняется) для Mac. Это полноценная Linux-среда, которая работает прямо на macOS. Быстрая, лёгкая, не исчезает после перезапуска. В основе — стандартные OCI-образы, их можно собирать и шарить.
Главное отличие от обычных контейнеров: контейнеры заточены под приложение, а container machine — под целое Linux-окружение. Она запускает init-систему образа, так что можно регистрировать долгоживущие сервисы или тестировать приложение под process supervisor.
Container machine автоматически подхватывает твой username и домашнюю директорию с Mac. Репозитории и dotfiles доступны на обеих платформах. Редактируешь код на macOS в своём любимом редакторе, а компилируешь и запускаешь внутри Linux. Никакого копирования: профайлеры, скриншоты, браузеры и GUI-отладчики видят те же файлы, что и container machine.
Можно запускать реальные сервисы: systemctl start postgresql работает на образах с systemd. Создаёшь отдельную container machine под каждый целевой дистрибутив — alpine, ubuntu, debian. У всех один и тот же $HOME и dotfiles с Mac. Пример: container machine create alpine:latest --name dev, потом container machine run -n dev — и ты в шелле под своим пользователем, не под root.
Управление простое: container machine ls, inspect, stop, rm. Есть алиас m — можно писать m ls, m run. Ресурсы меняются через container machine set -n dev cpus=4 memory=8G, после остановки и запуска. По умолчанию память — половина от хоста. Домашнюю директорию можно смонтировать в режиме rw, ro или вообще отключить (none).
Хочешь свой образ — любой Linux с /sbin/init подойдёт. В статье приведён Dockerfile для Ubuntu 24.04 с systemd и набором утилит. При первом запуске выполняется встроенный скрипт, который создаёт пользователя. Можно подложить свой скрипт в /etc/machine/create-user.sh — он отработает один раз, от root, с переменными CONTAINER_UID, CONTAINER_GID, CONTAINER_USER, CONTAINER_HOME, CONTAINER_MACHINE_ID.