Help:XSvacer:Webide:SvacerAsDockerContainer

From Svacer Wiki
Revision as of 11:24, 11 March 2025 by M.vinogradov (talk | contribs)

Поддержка функциональности webide когда Svacer развёрнут в docker-контейнере

На данный момент функциональность запуска Theia IDE по умолчанию настроена на запуск Svacer с помощью исполняемого файла, "рядом" с docker'ом.

Для поддержки функциональности webide когда Svacer развёрнут в docker-контейнере необходимо решить следующие задачи:

  1. Активация функциональности webide в docker-контейнере Svacer;
  2. Предоставить docker-контейнеру Svacer доступ к управлению контейнерами IDE;
  3. Организация сетевого доступа между контейнером Svacer и контейнерами IDE;
  4. Настройка доступа к общему хранилищу с исходными файлами для контейнера Svacer и контейнеров IDE;

Детали каждой задачи и варианты решения приведены ниже.

Приведённые решения основаны на развёртывании Svacer с помощью файла docker-compose.yml

Активация функциональности webide

Для активации функциональности webide необходимо при запуске Svacer указать флаг --xsvacer.features webide

Решение

В docker-compose.yml используется docker-образ Svacer, собранный на основе Dockerfile. В данном файле содержится инструкция запуска Svacer

CMD /svacer/bin/svacer-server --memsettings=${MEMSETTINGS} run --store $STORE --pg $SVACER_PG_URL

Для активации функциональности IDE необходимо переопределить аргументы инструкции CMD в файле docker-compose.yml:

services:
  ...
  svacer:
    ...
    command: /bin/sh -c '/svacer/bin/svacer-server --memsettings=$${MEMSETTINGS} run --store $$STORE --pg $${SVACER_PG_URL} --xsvacer.features webide'
Проверить актуальные значения аргументов инструкции CMD docker-образа можно с помощью команды docker image inspect {имя образа}

Предоставление контейнеру Svacer доступа к управлению контейнерами IDE

Функциональность запуска IDE основана на том, что Svacer управляет контейнерами IDE с помощью API docker'а. Поэтому необходимо предоставить доступ к API docker'а из docker-контейнера Svacer.

Решение

Один из способов подключения к API docker'а является использование socket-файла /var/run/docker.sock. Чтобы Svacer получил доступ к этому файлу, его необходимо примонтировать к docker-контейнеру:

services:
  ...
  svacer:
    ...
    volumes:
      ...
      - /var/run/docker.sock:/var/run/docker.sock:ro
      ...

Изменение настроек Svacer - svacer.cfg

Дальнейшие шаги связаны с изменением настроек Svacer. В случае, когда Svacer развёрнут в docker-контейнере, это можно сделать следующим образом:

  1. Создать конфигурационный файл svacer.cfg;
  2. Примонтировать файл к рабочей директории docker-контейнера Svacer;
  3. Перезапустить контейнер Svacer;

Чтобы примонтировать svacer.cfg к контейнеру Svacer нужно в файл docker-compose.yaml добавить строку:

services:
  ...
  svacer:
    ...
    volumes:
      ...
      - /path/to/svacer.cfg:/svacer/bin/svacer.cfg:ro
  ...

Перенос настроек функциональности webide в svacer.cfg

Скопировать секцию с настройками по умолчанию в svacer.cfg

Организация сетевого доступа между контейнером Svacer и контейнерами IDE

В текущей реализации при запуске docker-контейнер IDE публикует внутренний порт web-приложения Theia IDE на случайный порт всех сетевых интерфейсов (0.0.0.0) docker-хоста. Svacer хранит информацию на каком порте хоста развёрнуты соответствующие инстансы IDE и проксирует запросы к ним.

Необходимо организовать доступ контейнера Svacer к портам docker-хоста, на которых опубликованы контейнеры IDE.

Решение

Чтобы предоставить доступ контейнера Svacer к контейнеру IDE нужно:

  1. Определить ip-адрес интерфейса docker-хоста docker0;
  2. Изменить настройку публикации портов контейнеров IDE на значение ip-адреса docker0.

Определение ip-адреса docker0

На docker-хосте выполнить команду ip a:

$ ip a
...
6: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 82:70:b5:24:50:e4 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

В данном случае искомый ip-адрес - 172.17.0.1

Изменение настроек публикации портов контейнеров IDE

Настройки публикации порта контейнера IDE заданы в конфигурации запуска IDE. Настройки по умолчанию должны быть предварительно перенесены в svacer.cfg.

В файле svacer.cfg нужно добавить параметр hostip со значением ip-адреса интерфейса docker0:

xsvacer:
  webide:
    theia:
      1-46-0: &1-46-0
        ...
        docker:
          ...
          container:
            ...
            hostconfig:
              ...
              portbindings:
                "3000/tcp":
                  - hostport: 0
                    hostip: 172.17.0.1 # новый параметр
            ...


Настройка доступа к общему хранилищу с исходными файлами для контейнера Svacer и контейнеров IDE

При запуске IDE для просмотра снимка, Svacer экспортирует исходный код снимка в папку на docker-хосте. Далее эта папка монтируется к контейнеру IDE, к пути /home/project, который использует Theia IDE в качестве папки проекта.

При развёртывании Svacer в docker-контейнере необходимо настроить экспорт исходников в папку, которая может быть примонтирована к контейнеру IDE.

Решение

Путь к корневой папке, в которую будут экспортироваться исходники снимков, задаётся в конфигурационном параметре sourcesroot. Так как этот же параметр используется для настройки пути к корневой папке на docker-хосте, которая будет примонтирована к контейнеру IDE, то пути к папке с исходным кодом снимков должны совпадать в контейнере Svacer и на docker-хосте.

Пример конфигурации

svacer.cfg:

xsvacer:
  webide:
    theia:
      1-46-0: &1-46-0
        ...
        sourcesroot: /data/snapshot-sources
        ...

docker-compose.yaml:

services:
  ...
  svacer:
    ...
    volumes:
      ...
      - /data/snapshot-sources:/data/snapshot-sources
      ...

Схемы компонентов

Ниже приведены концептуальные схемы компонентов, на базе которых основана функциональность запуска IDE. Данные схемы могут быть использованы для поиска других решений приведённых выше задач.

Стандартный запуск Svacer в виде сервиса

Запуск Svacer внутри docker-контейнера