Перейти к содержанию

Работа в Dev Containers

Dev Containers — это спецификация containers.dev, а её основной файл — devcontainer.json. Он описывает, как собрать среду разработки в контейнере: какой образ использовать, какие инструменты и расширения ставить.

Главное правило: Koda работает там же, где находится проект, — то есть внутри контейнера. Команды, чтение и запись файлов, поиск, индексация и настройки выполняются на стороне контейнера.


Как это устроено

В удалённом окне VS Code держит проект и всё, что с ним связано, внутри контейнера. Koda работает там же:

  • чтение и запись файлов происходят в контейнере;
  • инструменты агента — чтение, редактирование, поиск и запуск команд — видят файлы внутри контейнера;
  • терминал открывается внутри контейнера;
  • индекс кодовой базы и настройки хранятся в контейнере.

Koda определяет такое окружение сама и считает, что команды выполняются в Linux. Поэтому агент знает, что работает не в вашей системе, и правильно разрешает пути.

В IDE на платформе JetBrains IntelliJ отдельного «удалённого окна» нет. Работа с контейнером строится через Remote Development: бэкенд IDE запускается внутри контейнера, а на вашем компьютере работает только клиент JetBrains.

Подключиться к Dev Container можно из JetBrains Toolbox App, окна приветствия IntelliJ IDEA или JetBrains Gateway. Контейнер запускается для проекта с файлом devcontainer.json на удалённой стороне или для проекта, клонированного из репозитория Git.

Koda устанавливается в бэкенд и работает внутри контейнера:

  • файлы читаются и записываются в контейнере;
  • команды выполняются оболочкой контейнера;
  • индекс кодовой базы и настройки хранятся в контейнере.

Простая проверка

Попросите агента выполнить в терминале команду pwd. Если путь начинается с /workspaces/... или другого каталога контейнера, значит Koda работает внутри контейнера.

Что это значит на практике

Файлы вашего компьютера при работе в контейнере Koda не затрагивает. Всё, что она делает с проектом, происходит внутри контейнера.


Что нужно сделать

  1. Установить и настроить Docker на своём компьютере — см. раздел Подготовка Docker.
  2. Открыть проект в контейнере — см. раздел Открытие проекта.
  3. Установить Koda в контейнер, а не только на свой компьютер — см. раздел Установка Koda.
  4. Войти в аккаунт — так же, как при обычной работе.
  5. Убедиться, что изнутри контейнера доступен api.kodacode.ru — см. раздел Сеть.
  6. При необходимости сохранить настройки и индекс между пересозданиями контейнера — см. раздел Настройки.

Подготовка Docker

Dev Containers собирает и запускает контейнеры через Docker, поэтому сначала установите и настройте Docker на своём компьютере.

  • Windows — Docker Desktop 2.0 и выше на Windows 10 Pro и Enterprise. На Windows 10 Home (2004 и выше) нужен Docker Desktop 2.3 и выше с бэкендом WSL 2: в настройках Docker включите Use the WSL 2 based engine и убедитесь, что ваш дистрибутив добавлен в Resources → WSL Integration.
  • macOS — Docker Desktop 2.0 и выше.
  • Linux — Docker CE/EE 18.06 и выше и Docker Compose 1.21 и выше. Добавьте пользователя в группу docker и перезайдите в систему:

    sudo usermod -aG docker $USER
    

    Пакет Docker из Ubuntu Snap не поддерживается — ставьте Docker из официального репозитория.

Контейнеры, с которыми работает Dev Containers: Debian 9 и выше, Ubuntu 16.04 и выше, CentOS и RHEL 7 и выше (архитектуры x86_64, ARMv7l, ARMv8l) или Alpine Linux 3.9 и выше (x86_64). Другие Linux-контейнеры на базе glibc обычно тоже подходят.

Об установке Docker — в документации Docker.


Открытие проекта

Сначала убедитесь, что выполнены предварительные условия:

  1. Установлен Docker.
  2. Установлено расширение Dev Containers (ms-vscode-remote.remote-containers).

Файл конфигурации devcontainer.json лежит в .devcontainer/devcontainer.json или прямо в корне проекта как .devcontainer.json. Если его нет, команда Dev Containers: Add Dev Container Configuration Files... предложит готовое определение из containers.dev, существующий Dockerfile или файл Docker Compose и добавит конфигурацию в проект.

Открыть папку в контейнере:

  1. Нажмите F1 и выберите Dev Containers: Open Folder in Container....
  2. Выберите папку проекта и отправную точку для контейнера — шаблон, Dockerfile или Docker Compose.
  3. Дождитесь сборки контейнера — окно перезагрузится и подключится к нему.

Переоткрыть уже открытую папку в контейнере. Если проект уже открыт в VS Code, выполните Dev Containers: Reopen in Container. Контейнер собирается только при первом открытии: дальше папка открывается быстро, и VS Code сам подхватывает конфигурацию.

Клонировать репозиторий сразу в том контейнера. Команда Dev Containers: Clone Repository in Container Volume... клонирует репозиторий, ветку или pull request GitHub прямо в отдельный том Docker, не затрагивая ваши файлы.

Если сборка контейнера не удалась, в появившемся диалоге выберите Reopen in Recovery Container — откроется минимальный контейнер, в котором можно поправить Dockerfile или конфигурацию, а затем повторить Reopen in Container.

Производительность

По умолчанию папка проекта монтируется в контейнер из вашей файловой системы. На Windows и macOS это даёт небольшую задержку ввода-вывода, поэтому для тяжёлых проектов удобнее клонировать репозиторий в том контейнера.

Если проект лежит внутри WSL, сначала откройте его в WSL (см. страницу «WSL»), а затем выполните Dev Containers: Reopen in Container.

Если Docker установлен на удалённом хосте по SSH, подключитесь к нему по SSH, откройте папку там и выполните Dev Containers: Reopen in Container — локальный Docker не нужен. Подробнее — на странице «Remote SSH».

Работа с контейнером идёт через Remote Development:

  1. В окне приветствия IntelliJ IDEA выберите Remote Development, затем Create Dev Containers. То же доступно из JetBrains Toolbox App и JetBrains Gateway.
  2. Настройте подключение к Docker на удалённой машине по SSH — через меню параметров. Если удалённый сервер не настроен, добавьте нужные параметры SSH-подключения.
  3. Выберите бэкенд IDE для проекта.
  4. Выберите проект, для которого собирается Dev Container:
    • проект на удалённой машине — укажите путь к файлу .json проекта;
    • проект на GitHub — укажите репозиторий и способ поиска файла: Automatic (определить автоматически) или Specify Path (указать путь вручную). Нажмите Build Container and Continue.
  5. Дождитесь сборки контейнера — проект откроется в JetBrains Client.

Что нужно для Dev Container в JetBrains

Для локального Dev Container нужен проект с папкой .devcontainer и файлом devcontainer.json, а также установленный Docker. Для удалённого Dev Container Docker нужен и на удалённой, и на локальной машине, авторизация к серверу и Git идёт по SSH-ключам, а на удалённом сервере требуется Java 17 или новее.

Плагин Koda устанавливается уже в запущенный бэкенд — см. раздел Установка Koda.


Установка Koda

  1. Откройте проект в контейнере — как описано в разделе Открытие проекта.
  2. Откройте раздел Расширения.
  3. Найдите Koda.koda и нажмите Установить в Container.
  4. Дождитесь установки и при необходимости перезагрузите окно.

Чтобы расширение ставилось само при каждом создании контейнера, добавьте его в devcontainer.json — см. раздел Автоматическая настройка. Также можно нажать правой кнопкой на расширение в списке и выбрать Add to devcontainer.json.

Где установлено расширение

В списке расширений есть отдельные категории: Local - Installed — расширения на вашем компьютере, и Dev Container: <имя> — Installed — расширения внутри контейнера. Расширения, установленные локально, но нужные в контейнере, показаны приглушёнными: рядом с ними есть кнопка Установить. Установить сразу все локальные расширения в контейнер можно кнопкой с облаком рядом с заголовком Local - Installed.

Расширения по умолчанию

Список расширений, которые ставятся в каждый контейнер, можно задать параметром dev.containers.defaultExtensions. Ненужное расширение из базового образа можно исключить, указав его в devcontainer.json со знаком минус, например "-dbaeumer.vscode-eslint".

Установите плагин Koda в бэкенд IDE, работающий внутри контейнера. Если проект использует devcontainer.json, плагин можно перечислить среди устанавливаемых расширений — см. раздел Автоматическая настройка. Плагин ставится из JetBrains Marketplace так же, как любой другой.

Общая инструкция по установке — на странице Установка плагина.


Автоматическая настройка

Через devcontainer.json можно заранее описать всё нужное для работы Koda, чтобы при каждом создании контейнера это настраивалось само.

Установить расширение Koda в контейнер:

.devcontainer/devcontainer.json
{
  "customizations": {
    "vscode": {
      "extensions": ["Koda.koda"]
    }
  }
}

Установить плагин Koda в бэкенд JetBrains:

.devcontainer/devcontainer.json
{
  "customizations": {
    "jetbrains": {
      "plugins": ["Koda"]
    }
  }
}

Установить ripgrep для быстрого поиска по содержимому:

.devcontainer/devcontainer.json
{
  "postCreateCommand": "sudo apt-get update && sudo apt-get install -y ripgrep"
}

Сохранить настройки и индекс Koda между пересозданиями контейнера — вынести каталог ~/.koda в отдельный том:

.devcontainer/devcontainer.json
{
  "mounts": [
    { "source": "koda-home", "target": "/home/vscode/.koda", "type": "volume" }
  ]
}

Путь зависит от пользователя контейнера

В примере выше используется путь /home/vscode/.koda — для стандартного пользователя vscode. Если контейнер работает под другим пользователем, укажите соответствующий домашний каталог (например, /root/.koda для root).

Добавить готовые наборы установки через Features — например, GitHub CLI:

.devcontainer/devcontainer.json
{
  "features": {
    "ghcr.io/devcontainers/features/github-cli:1": {}
  }
}

Features берутся из общего каталога containers.dev и описывают установку инструментов, сред выполнения и библиотек.

Задать настройки, которые действуют только внутри контейнера:

.devcontainer/devcontainer.json
{
  "customizations": {
    "vscode": {
      "settings": {
        "editor.formatOnSave": true
      }
    }
  }
}

Свойства можно объединить

Все перечисленные свойства можно указать в одном файле devcontainer.json.


Файлы, пути и терминал

Koda работает с файлами проекта напрямую, поэтому пути указываются так, как они выглядят в контейнере.

  • Относительные пути (например, src/index.ts) ищутся в корне проекта.
  • Абсолютные пути внутри контейнера (например, /workspaces/my-app) разрешаются в файловой системе контейнера.

Команды выполняются в терминале на стороне контейнера.

  • Команды работают в том же окружении, что и проект, поэтому доступны все установленные в контейнере утилиты.
  • Терминал Koda переиспользуется: если команда активировала виртуальное окружение или изменила переменные, это сохраняется между вызовами.
  • Команды можно останавливать — Koda прерывает их и при необходимости закрывает терминал.
  • Слишком большой вывод команды сокращается до 2000 строк или 50 КиБ, а полный текст сохраняется в файл — см. «Большой вывод инструментов».

Файлы вне проекта

Инструменты работают в первую очередь с файлами открытого проекта. Если путь ведёт за пределы проекта, Koda может его не найти.


Поиск по содержимому выполняется на стороне контейнера. Koda сама проверяет, какие средства поиска доступны внутри контейнера, и выбирает из двух вариантов:

  • ripgrep (rg) — быстрый поиск, как в локальном окружении;
  • обычный grep — запасной вариант, если ripgrep не установлен.

Ограничения запасного варианта

У grep нет части возможностей ripgrep: часть шаблонов поиска переводится в упрощённый вид, а очень длинные строки обрезаются. Для надёжного поиска по содержимому установите ripgrep внутри контейнера — например, через postCreateCommand (см. раздел Автоматическая настройка).

Если ни ripgrep, ни grep не найдены, поиск по содержимому в проекте недоступен.

Поиск по содержимому работает обычным для JetBrains способом — через упакованный или системный ripgrep. Отдельно устанавливать ripgrep в контейнер не нужно.

Поиск файлов по имени учитывает правила .gitignore и .kodaignore.


Индексация

Данные индексации хранятся на стороне контейнера, в каталоге ~/.koda/index внутри контейнера.

  • Впервые открыв проект в контейнере, Koda построит индекс заново.
  • Если контейнер пересоздаётся, каталог ~/.koda может быть потерян вместе с индексом — тогда проект нужно проиндексировать повторно.
  • Чтобы сохранить индекс между пересозданиями, вынесите ~/.koda в отдельный том — см. раздел Автоматическая настройка.

Индексация включается на вкладке Индексация в настройках — см. Настройки индексации. Подробнее о решении проблем с индексацией — на странице Индексация.


Настройки

В контейнере Koda читает настройки со стороны контейнера — как если бы она была запущена в этой системе.

  • Глобальный файл config.yaml лежит в ~/.koda/config.yaml внутри контейнера, а не в ~/.koda вашей системы.
  • Проектный файл .kodarc.json — в корне проекта внутри контейнера.
  • Правила из файла .kodarules и игноры из .kodaignore — также в корне проекта в контейнере.
  • Локальные навыки из .koda/skills, .claude/skills и .agents/skills ищутся относительно корня проекта в контейнере.

Настройки у каждой стороны свои

У вашего компьютера и у контейнера разные домашние каталоги, поэтому ~/.koda/config.yaml у них не общий. Настройки, сделанные на вашем компьютере, не переносятся в контейнер автоматически. Если настройки нужны и там, скопируйте файл конфигурации в ~/.koda контейнера или вынесите каталог в том.


Сеть

Запросы к моделям Koda выполняет та же сторона, где работает Koda, — то есть контейнер.

  • Изнутри контейнера должен быть доступен api.kodacode.ru.
  • Учитывайте ограничения сети контейнера: при закрытой сети запросы к моделям не пройдут.
  • Если вы используете прокси или VPN, настройте их доступность и внутри контейнера.
  • Если приложению внутри контейнера нужно принимать подключения с вашего компьютера, опубликуйте или пробросьте порт: свойство forwardPorts в devcontainer.json либо команда Forward a Port.

Управление контейнерами

По умолчанию Dev Containers сам запускает контейнер при открытии папки и останавливает его при закрытии VS Code. Изменить это поведение можно свойством "shutdownAction": "none" в devcontainer.json.

Управлять контейнерами удобно через Remote Explorer: в разделе Containers можно остановить, запустить или удалить контейнер, а в разделе Dev Volumes — посмотреть тома и открыть их в контейнере.

Отдельная модель работы — подключение к уже запущенному контейнеру: команда Dev Containers: Attach to Running Container... подключает VS Code к работающему контейнеру без его пересоздания.

Управление контейнером выполняется средствами JetBrains Gateway и Docker.


Типичные проблемы

Koda не видит файлы проекта

Убедитесь, что Koda установлена в контейнер, а проект открыт в контейнере. Проверьте, что папка проекта действительно открыта как рабочая область.

Команды выполняются не там, где ожидается

Команды всегда выполняются на стороне контейнера. Если вы ожидали команды на своём компьютере, откройте проект локально.

Поиск по содержимому ничего не находит

Проверьте, установлен ли ripgrep или grep внутри контейнера. Также убедитесь, что искомый текст не исключён правилами .gitignore или .kodaignore.

После пересоздания контейнера пропали настройки или индекс

Каталог ~/.koda внутри контейнера не сохраняется между пересозданиями. Вынесите его в отдельный том через mounts в devcontainer.json — см. раздел Автоматическая настройка.

Koda не отвечает

Проверьте, что изнутри контейнера есть доступ к api.kodacode.ru — см. раздел Сеть. Если вы используете прокси или VPN, они тоже должны быть доступны внутри контейнера.

Контейнер на Alpine: часть расширений не работает

В контейнерах на Alpine Linux некоторые расширения могут не работать из-за зависимости от glibc в нативном коде. Если это мешает, используйте образ на базе Debian или Ubuntu.

Образы Windows-контейнеров не поддерживаются

Dev Containers работает только с Linux-контейнерами. Образы Windows-контейнеров и Docker Toolbox не поддерживаются. Пакет Docker из Ubuntu Snap тоже не поддерживается — ставьте Docker из официального репозитория.