Help:XSvacer:Webide:SvacerAsDockerContainer

From Svacer Wiki
Revision as of 10:16, 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
      ...