✻ Claude Code по-русски
🎧 Аудиокурс
🎧 Озвучка этой страницы готовится.

#Dev-контейнеры

Продвинутый уровень · Факультатив · около 20 минут плюс время запуска · Нужно: Ограничьте автономные запуски · Сверено с Claude Code v2.1.285 (stable) 09.10.2026

#Цель

К концу этого факультатива вы сможете запускать Claude Code внутри dev-контейнера, сохранять вход при пересборке и давать ему работать без присмотра за файрволом.

#Что понадобится

#Идея

Dev-контейнер — это Docker-контейнер, к которому подключается ваш редактор, на вашем компьютере или в облаке вроде GitHub Codespaces. Если в нём работает Claude Code, команды Claude выполняются в контейнере, а его правки попадают в ваш репозиторий. В отличие от песочницы Bash из урока 4 Среднего уровня, которая оборачивает только команды оболочки, контейнер вмещает весь процесс Claude Code: и файловые инструменты, и MCP-серверы, и хуки (Compare sandboxing approaches).

Три части, каждая дополняет предыдущую:

Внимание

С --dangerously-skip-permissions «dev-контейнеры не мешают вредоносному проекту вынести всё, что доступно внутри контейнера, включая учётные данные Claude Code, хранящиеся в ~/.claude» (Development containers). Расширение Dev Containers в VS Code к тому же переиспользует в контейнере ваши локальные учётные данные Git и пробрасывает запущенный SSH-агент, а эталонный файрвол пропускает GitHub и SSH, так что запуск может ими пушить (Sharing Git credentials with your container). Используйте dev-контейнер только с репозиториями, которым доверяете, и никогда не монтируйте в него секреты хоста вроде ~/.ssh или файлов с облачными учётными данными.

#Разбор примера

  1. На GitHub откройте .devcontainer/devcontainer.json в своей копии шаблона:
{
  "name": "Claude Code practice",
  "image": "mcr.microsoft.com/devcontainers/base:ubuntu",
  "features": {
    "ghcr.io/devcontainers/features/node:1": { "version": "lts" },
    "ghcr.io/anthropics/devcontainer-features/claude-code:1.0": {}
  },
  "postCreateCommand": "sudo apt-get update && sudo apt-get install -y bubblewrap socat"
}

Тег :1.0 закрепляет скрипт установки фичи, а не Claude Code: фича устанавливает последний релиз, который затем обновляется сам (Add Claude Code to your dev container). postCreateCommand устанавливает bubblewrap и socat, которые нужны песочнице Bash в Linux (Set up Linux and WSL2). 2. Выберите Code, затем вкладку Codespaces и создайте codespace на main (Creating a codespace for a repository). Он откроется в редакторе, заданном в ваших настройках Codespaces (Setting your default editor for GitHub Codespaces); шаги 3–6 используют VS Code — в браузере или в настольном приложении. 3. В его терминале:

echo "$CODESPACES"; whoami; claude --version

Будут выведены три строки: true (GitHub задаёт CODESPACES в каждом codespace, Default environment variables for your codespace), vscode (непривилегированный пользователь образа, Ubuntu image) и версия, которая может быть новее отметки на этой странице. 4. Запустите claude, войдите и, когда спросит, доверьтесь папке. Если браузер показывает код вместо возврата в терминал, вставьте его в ответ на Paste code here if prompted (Log in to Claude Code). Затем попросите:

Run uname -a and whoami, then tell me which machine you're running on.

Одобрите команду, если Claude спросит. Claude опишет Linux-контейнер, а не ваш компьютер; формулировки у вас будут другими. Выйдите через /exit. 5. Выполните claude auth status --text: вы вошли (CLI commands). Пересоберите: откройте палитру команд (Ctrl+Shift+P или Cmd+Shift+P на Mac), выполните Codespaces: Rebuild Container и выберите Rebuild (Rebuilding the container in a codespace). После переподключения:

claude auth status --text; echo "exit $?"

Вывод заканчивается на exit 1: вход не выполнен. Пересборка сохраняет /workspaces, где лежит ваш репозиторий, и очищает ~/.claude (Persisting data over a rebuild). 6. Остановите codespace: выполните Codespaces: Stop Codespace из палитры команд или выберите Stop codespace в меню ... рядом с ним на github.com/codespaces. Закрытие вкладки браузера его не останавливает (Stopping and starting a codespace).

#Ваша очередь

Задание: поместите один из своих репозиториев в эталонный контейнер с включённым файрволом и закреплённой версией Claude Code. Сохраните вход при пересборке, дайте Claude выполнить одну небольшую задачу без присмотра, затем проверьте результат на своём компьютере.

Шаги документации открывают в контейнере собственный репозиторий Claude Code; чтобы использовать контейнер со своим проектом, скопируйте его папку .devcontainer/ в свой репозиторий и подправьте Dockerfile под инструменты своего проекта (Try the reference container). В новой ветке скачайте три файла из коммита, с которым сверялось это руководство:

git switch -c try-devcontainer
mkdir -p .devcontainer
ref=d945a61bc6346abce607252d5667df8a3bf0461a
for f in devcontainer.json Dockerfile init-firewall.sh; do
  curl -fsSL "https://raw.githubusercontent.com/anthropics/claude-code/$ref/.devcontainer/$f" -o ".devcontainer/$f"
done

Критерии приёмки:

Когда все пункты раздела «Проверка» ниже выполнены, разберите всё:

  1. В терминале контейнера выполните claude auth logout (CLI commands). Пока вы не вышли, том конфигурации хранит ваши учётные данные, а том живёт дольше контейнера.
  2. Закройте окно VS Code, подключённое к контейнеру. По умолчанию закрытие останавливает контейнер (shutdownAction в Dev Container metadata reference).
  3. Удалите контейнер: в Remote Explorer VS Code выберите Containers, затем щёлкните правой кнопкой по контейнеру и удалите его (Managing containers) или выполните docker rm <container> (docker container rm).
  4. Удалите два тома, имена которых начинаются с claude-code-config- и claude-code-bashhistory-: docker volume ls их покажет, а docker volume rm <name> удалит каждый. Docker не удаляет том, который ещё использует контейнер, поэтому этот шаг идёт после шага 3 (docker volume rm).

#Проверка

Факультатив пройден, когда выполнено всё это:

Если jq сообщает об ошибке разбора, уберите комментарии или висячие запятые, которые вы добавили в devcontainer.json. Если example.com отвечает или api.github.com не отвечает, скрипт файрвола не отработал: выполните в контейнере sudo /usr/local/bin/init-firewall.sh и прочитайте ошибку. Element cannot be added to the set: it's already added означает, что не хватает правки с -exist. Если claude auth status после пересборки завершается с кодом 1, target тома и CLAUDE_CONFIG_DIR в containerEnv должны указывать на один и тот же путь (Persist authentication and settings across rebuilds). Если файл статуса пуст, запуск ничего не изменил, закоммитил своё изменение (git log -1 его покажет) или остановился на --max-turns, что завершается ошибкой (CLI flags): прочитайте, что он вывел, и дайте задачу поменьше, если ему не хватило ходов.

#Осторожно

#Что дальше


Источники: Development containers · Choose a sandbox environment · Choose a permission mode · Configure the sandboxed Bash tool · Authentication · Advanced setup · CLI reference · Enterprise network configuration · Claude Code: эталонный dev-контейнер на d945a61 · GitHub: Creating a codespace for a repository, Setting your default editor for GitHub Codespaces, Default environment variables for your codespace, Rebuilding the container in a codespace, Stopping and starting a codespace, Deleting a codespace, GitHub Codespaces billing · VS Code: Developing inside a Container, Sharing Git credentials with your container · Dev Container metadata reference · Образы Dev Container: Ubuntu · Docker: Volumes, docker container rm, docker volume rm · Git: githooks · ipset

Назад к оглавлению Продвинутого уровня · Тема: Разрешения и безопасность · Застряли на уроке?