Проблема

VS Code — самый чистый способ дать каждому участнику проекта одинаковое окружение: та же ОС, те же версии инструментов, тот же shell. Но за это приходится платить: при первом открытии проекта VS Code собирает образ контейнера с нуля. Установка базового слоя ОС, рантайма языка, shell и любых AI-инструментов поверх него может занять несколько минут — и это повторяется при каждом изменении Dockerfile, инвалидирующем кэш.

Для команд, которые также используют Claude Code внутри контейнера, есть ещё один источник трения: чтобы аутентификация, история shell и кэш npm переживали пересборку контейнера, один и тот же шаблонный devcontainer.json приходится копировать в каждый репозиторий.

Как это решается

nerdy-pro-dev-container — это готовый Docker-образ, опубликованный в GitHub . Вместо сборки образа 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 — сохраняет собственную оригинальную лицензию.

Это готовый мультиархитектурный Docker-образ для VS Code Dev Containers, включающий Node.js LTS, zsh и Claude Code, опубликованный в GitHub Container Registry как ghcr.io/nerdy-pro/nerdy-pro-dev-container. Проект указывает на этот образ в devcontainer.json и полностью пропускает этап сборки.
Нет. Образ опубликован в GitHub Container Registry и скачивается напрямую VS Code. Указание в devcontainer.json на ghcr.io/nerdy-pro/nerdy-pro-dev-container:latest полностью пропускает этап сборки.
Ubuntu 26.04, Node.js LTS, Claude Code, zsh с oh-my-zsh (плагины git и fzf) и стандартные CLI-инструменты, включая git, curl, wget, jq, gpg и клиент OpenSSH.

Выполните claude setup-token на хосте, чтобы сгенерировать долгоживущий токен, сохраните его в менеджере учётных данных хоста и пробросьте в контейнер как переменную окружения CLAUDE_CODE_OAUTH_TOKEN через remoteEnv в devcontainer.json.

Да. Четыре Docker-тома сохраняют конфигурацию Claude Code, историю zsh, кэш npm и SSH known_hosts между пересборками, поэтому повторная аутентификация и установление доверия не требуются каждый раз.
Образ собирается как для linux/amd64, так и для linux/arm64, поэтому один и тот же тег работает и на Intel/AMD, и на Apple Silicon.
Образы публикуются только из релизов GitHub. Каждый релиз создаёт четыре тега — точную версию вроде 1.0.0, минорную версию вроде 1.0, мажорную версию вроде 1 и latest — так что проект может закрепиться на конкретной версии или следовать за последним стабильным релизом.