Проблема
Dev-контейнеры VS Code — самый чистый способ дать каждому участнику проекта одинаковое окружение: та же ОС, те же версии инструментов, тот же shell. Но за это приходится платить: при первом открытии проекта VS Code собирает образ контейнера с нуля. Установка базового слоя ОС, рантайма языка, shell и любых AI-инструментов поверх него может занять несколько минут — и это повторяется при каждом изменении Dockerfile, инвалидирующем кэш.
Для команд, которые также используют Claude Code внутри контейнера, есть ещё один источник трения: чтобы аутентификация, история shell и кэш npm переживали пересборку контейнера, один и тот же шаблонный devcontainer.json приходится копировать в каждый репозиторий.
Как это решается
nerdy-pro-dev-container — это готовый мультиархитектурный Docker-образ, опубликованный в GitHub Container Registry. Вместо сборки образа dev-контейнера для каждого проекта репозиторий указывает в devcontainer.json на опубликованный образ, и VS Code скачивает его напрямую — без этапа сборки, без ожидания.
Образ включает всё необходимое для немедленной работы над Node.js-проектом:
- Ubuntu 26.04 в качестве базового образа (официальный
devcontainers/baseот Microsoft) - Node.js LTS, установленный через NodeSource
- Claude Code, установленный глобально через npm
- zsh с oh-my-zsh, настроенный с плагинами
gitиfzfкак shell по умолчанию - Стандартные CLI-инструменты — git, curl, wget, jq, gpg, клиент OpenSSH, fzf
- sudo без пароля для пользователя
vscode
Образ собирается как для linux/amd64, так и для linux/arm64, поэтому один и тот же тег работает и на Intel/AMD, и на Apple Silicon.

Сохранение состояния между пересборками
Контейнер, который пересобирается при каждом изменении Dockerfile, удобен только если состояние не сбрасывается вместе с ним. Шаблон подключает четыре именованных Docker-тома, чтобы ничего не терялось между пересборками:
- Конфигурация и данные сессий Claude Code (директория
.claude, черезCLAUDE_CONFIG_DIR) - История команд zsh (
HISTFILEна постоянном томе) - Кэш npm-пакетов
known_hostsдля SSH, чтобы доверие к git-хостам не приходилось устанавливать заново каждый раз
Аутентификация git пробрасывает SSH-агент хоста внутрь контейнера, а gitconfig хоста копируется автоматически — коммиты, сделанные внутри контейнера, получают правильную авторскую идентичность без какой-либо ручной настройки.
Начало работы
Скопируйте шаблон в .devcontainer/devcontainer.json:
{
"name": "my-project",
"image": "ghcr.io/nerdy-pro/nerdy-pro-dev-container:latest"
}
Переоткройте проект в dev-контейнере — Node.js, zsh и Claude Code будут готовы без этапа сборки.
Аутентификация Claude Code
Claude Code внутри контейнера считывает переменную окружения CLAUDE_CODE_OAUTH_TOKEN вместо интерактивного входа. Сгенерируйте долгоживущий токен на хосте:
claude setup-token
Сохраните его в менеджере учётных данных хоста — Keychain на macOS, keyring рабочего стола (secret-tool) на Linux или DPAPI на Windows — и пробросьте в контейнер через запись remoteEnv в devcontainer.json, чтобы его никогда не приходилось вводить внутри самого контейнера.
Первая git-операция
Первый push или fetch в свежем контейнере запрашивает подтверждение ключа хоста в терминале — разовое подтверждение, устанавливающее SSH-доверие к этому git-хосту, которое затем кэшируется на постоянном томе known_hosts.
Версионирование и релизы
Образы собираются и публикуются только из релизов GitHub, а не при каждом коммите — изменение Dockerfile в main никак не влияет на других, пока не выпущен релиз. Каждый релиз публикует четыре тега:
| Тег | Поведение |
|---|---|
1.0.0 | Зафиксирован — никогда не меняется |
1.0 | Обновляется при патч-релизах |
1 | Обновляется при минорных и патч-релизах |
latest | Всегда последний стабильный релиз |
Этот диапазон позволяет проекту закрепиться на точной версии ради воспроизводимости или следовать за latest, чтобы обновляться автоматически.
Лицензия
Dockerfile, шаблон devcontainer.json и документация лицензированы по MIT. Всё, что установлено поверх базового образа — Ubuntu, Node.js, zsh, fzf, Claude Code — сохраняет собственную оригинальную лицензию.
Выполните claude setup-token на хосте, чтобы сгенерировать долгоживущий токен, сохраните его в менеджере учётных данных хоста и пробросьте в контейнер как переменную окружения CLAUDE_CODE_OAUTH_TOKEN через remoteEnv в devcontainer.json.