Почему движок важен для тестов
Набор тестов Testcontainers запускает настоящий Postgres, Kafka или Redis для класса тестов, а затем удаляет его. Dev Container пересобирает и перезапускает всю цепочку инструментов проекта. В обоих случаях время уходит на вызовы жизненного цикла: создание, запуск, остановку и удаление, снова и снова. В этих вызовах Oxcart самый быстрый.
| Операция | Oxcart 0.1.2 | По сравнению со следующим по скорости |
|---|---|---|
| Создание через API (без CLI) | 2.5 ms | 7× |
| Запуск через API | 18.5 ms | 2,1× |
| Остановка через API | 4.0 ms | 21× |
| Создание и запуск 20 контейнеров | 0.69 s | 2,5× |
| Остановить и удалить 20 контейнеров | 77 ms | 8,9× |
docker run --rm … true | 42 ms | 3,4× |
Oxcart 0.1.2 измерен 2026-10-10 с комплектным клиентом docker 29.9; остальные среды измерены ранее в тот же день на том же Mac и тем же набором тестов с docker 29.4. Apple M5 Max, по 8 CPU и 12 GiB каждой, среды запускались по одной, медианы пяти замеров. Полная таблица: сравнения.
Подключите Dev Containers и Testcontainers к Oxcart
- Установите и откройте Oxcart. Настройка создаёт контекст Docker с именем
oxcart. Он становится текущим, только если ничто другое не используется; проверьте черезdocker context show. - Направьте команду docker на Oxcart. Выполните
docker context use oxcartили включите Use Oxcart for the docker command в Settings › Command line tools. Отключение возвращает прежний контекст. - Передайте сокет тестовым фреймворкам. Для инструментов, читающих
DOCKER_HOSTвместо контекстов Docker, экспортируйте его из контекста:export DOCKER_HOST=$(docker context inspect oxcart --format '{{.Endpoints.docker.Host}}'). - Запустите тесты. Запустите набор тестов как обычно. Testcontainers создаёт, запускает и удаляет контейнеры через Docker Engine API.
- Откройте Dev Container. Откройте проект в его Dev Container или выполните
devcontainer up --workspace-folder .через CLI Dev Containers.
Testcontainers
Библиотеки Testcontainers (Java, Go, Node, Python, .NET и другие) обращаются напрямую к Docker Engine API, а не через CLI docker. Oxcart согласовывает версию API 1.54 и принимает версии от 1.40 до 1.54, поэтому актуальные версии Testcontainers подключаются без особых настроек, как только находят сокет.
Как найти сокет
Testcontainers сначала проверяет DOCKER_HOST. Сокет Oxcart находится в частной папке состояния с режимом 0600, а путь хранится в контексте Docker oxcart. Экспортируйте его один раз для shell или задайте в настройках запуска тестов IDE:
export DOCKER_HOST=$(docker context inspect oxcart --format '{{.Endpoints.docker.Host}}')
./gradlew test # or: mvn verify, go test ./..., pytest, npm test Вспомогательные контейнеры и сокет внутри контейнеров
Testcontainers запускает небольшой вспомогательный контейнер для очистки после аварийных тестов; в некоторых конфигурациях сами тесты работают в контейнере. В обоих случаях подключается сокет Docker. В Oxcart -v /var/run/docker.sock:/var/run/docker.sock даёт контейнеру тот же API Docker со стороны Linux, поэтому вспомогательные контейнеры, docker-outside-of-docker, Portainer и Traefik работают ожидаемым образом. Если инструмент пытается подключить в контейнер путь DOCKER_HOST со стороны Mac, стандартная настройка Testcontainers TESTCONTAINERS_DOCKER_SOCKET_OVERRIDE указывает вместо него /var/run/docker.sock.
Образы, собранные из Dockerfile
Testcontainers может собрать образ из Dockerfile в тесте (ImageFromDockerfile и аналоги). Для этого используется конечная точка сборки Engine API, которую Oxcart выполняет через BuildKit, с контекстами tar (обычными и gzip), аргументами сборки, метками и несколькими тегами.
Dev Containers
Dev Container описывает инструменты проекта в виде контейнера, а средства Dev Containers (расширение VS Code, CLI devcontainer и использующие его редакторы) собирают и запускают его через CLI docker. При текущем контексте oxcart это делает Oxcart.
Открывайте проект вместе с его инструментами и вспомогательными сервисами. CLI Dev Containers запускает рабочую область рядом с Postgres, Redis и другими сервисами; пользователь node без root может редактировать рабочую область, а скрипт после создания подготавливает зависимости проекта. Одна конфигурация даёт всей команде одинаковое окружение.
npm install -g @devcontainers/cli
devcontainer up --workspace-folder .
devcontainer exec --workspace-folder . bash Советы по Dev Containers на Apple silicon
- Архитектура: большинство базовых образов Dev Containers выпускаются для arm64. Образы только для amd64 Oxcart запускает через Rosetta; см. Docker Compose на Apple silicon.
- Зависимости в томах: храните
node_modules, кеши пакетов и данные баз в именованных томах, а исходный код — в рабочей области, подключённой через bind mount. - Наблюдение за файлами: изменения на Mac не создают события inotify внутри контейнеров, поэтому файловому наблюдателю в контейнере нужен опрос.
- Агенты программирования: агент в Dev Container держит свой shell в контейнере проекта; агент на Mac может просматривать сервисы Dev Container через MCP-сервер Oxcart (Docker для ИИ-агентов программирования).
Контекст Docker без сюрпризов
Oxcart создаёт контекст oxcart при настройке и делает текущим, только если это ничему не мешает: текущий контекст — default и его сокет не отвечает. Иначе текущий контекст сохраняется. В Settings › Command line tools есть Use Oxcart for the docker command: он переключает на oxcart и запоминает прежний контекст; отключение возвращает его. Oxcart никогда не создаёт и не заменяет /var/run/docker.sock на Mac, а API никогда не работает по TCP.
Вопросы
Работает ли Testcontainers на Mac с Apple silicon и Oxcart?
Да. Testcontainers обращается к Docker Engine API, реализованному в Oxcart (версии от 1.40 до 1.54), включая конечную точку сборки образов из Dockerfile. Контейнеры также могут подключать сокет Docker по адресу /var/run/docker.sock, как ожидают вспомогательные контейнеры Testcontainers.
Как задать DOCKER_HOST для Testcontainers?
Прочитайте значение из контекста Docker oxcart: docker context inspect oxcart --format '{{.Endpoints.docker.Host}}' выводит путь unix://. Экспортируйте его как DOCKER_HOST в shell или настройках запуска тестов IDE.
Почему интеграционные тесты быстрее с Oxcart?
Тесты тратят значительную часть времени на создание, запуск, остановку и удаление контейнеров. На том же Mac Oxcart показал 2.5 ms на создание через API, 18.5 ms на запуск, 4.0 ms на остановку и 77 ms на остановку и удаление 20 контейнеров — лучший результат из трёх протестированных сред для каждой операции.
Работает ли VS Code Dev Containers с Oxcart?
CLI Dev Containers 0.89.0 собрал и запустил в Oxcart реальную конфигурацию из нескольких сервисов: Postgres и Redis прошли проверки состояния, а пользователь контейнера мог записывать в рабочую область. Средства Dev Containers управляют CLI docker, поэтому направьте его на Oxcart через контекст oxcart.
Работает ли docker-outside-of-docker в Dev Container?
Да. Подключите /var/run/docker.sock в контейнер, и CLI docker внутри будет обращаться к тому же движку. Частные конечные точки Oxcart через этот сокет недоступны, поэтому контейнер может управлять контейнерами, но не обращаться к внутренним функциям Oxcart.
Заменяет ли Oxcart /var/run/docker.sock на моём Mac?
Нет. Oxcart никогда не создаёт и не заменяет /var/run/docker.sock на Mac. Клиенты обращаются к нему через контекст Docker oxcart или указанный в нём путь сокета.
Источники и методика
- Совместимость: проверенные интеграции Oxcart (сборка через Engine API для docker-py и Testcontainers, CLI Dev Containers 0.89.0, сокет Docker внутри контейнеров) и диапазон версий API.
- Выбор контекста Docker и настройка командной строки: поставляемый Oxcart.
- Показатели скорости: Oxcart 0.1.2, 2026-10-10, Apple M5 Max, 8 CPU и 12 GiB; остальные среды измерены ранее в тот же день на том же Mac и тем же набором тестов с клиентом docker 29.4.