Help:XSvacer:Webide:SvacerAsDockerContainer

From Svacer Wiki

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

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

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

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

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

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

Предоставление контейнеру 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. Перенести настройки функциональности webide;
  3. Примонтировать файл к рабочей директории docker-контейнера Svacer;
  4. Перезапустить контейнер Svacer;

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

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

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

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

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

Варианты активации функциональности webide:

  1. указать флаг --xsvacer.features webide при запуске Svacer;
  2. в конфигурационном файле (svacer.cfg) добавить значение webide в список /xsvacer/features;

Решение

Второй вариант активации функциональности является более предпочтительным. В svacer.cfg необходимо добавить следующую настройку:

xsvacer:
  features:
    - webide # активация функциональности webide
  ...
Альтернативное решение с использованием флага --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

В текущей реализации при запуске 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.yml:

services:
  ...
  svacer:
    ...
    volumes:
      ...
      - /data/snapshot-sources:/data/snapshot-sources # привязка с разрешением на запись
      ...

Примеры файлов с описанными изменениями

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

svacer.cfg
Ниже приведён файл svacer.cfg содержащий только секцию xsvacer. Если файл svacer.cfg создан и содержит другие настройки, то приведённые ниже настройки должны быть перенесены в существующий файл
xsvacer:
  features:
    - webide # активация функциональности webide
  webide:
    theia:
      1-46-0: &1-46-0
        disabled: true
        order: 0
        name: Theia blueprint web IDE (v1.46.0)
        sourcesroot: /data/snapshot-sources # путь к базовой папке с исходным кодом снимков
        sarif:
          filenametemplate: "warnings.sarif"
          commenttemplate: "{{if trim .Text}}`[{{.CreateTs.Local.Format \"02.01.2006 15:04\"}}] {{.CreatedBy}}:`\n\n{{trim .Text}}{{end}}"
        healthcheck:
          starttoreadyretries: 10
          starttoreadyperiod: 200ms
        docker:
          hostid: default
          containernametemplate: "theia-1-46-{{.StartArgs.SnapshotID}}"
          image:
            name: theia-blueprint
            tag: 1.46.0.sarif.clang.10.0.0
            sourcetype: file
            sourcefileurl: https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.10.0.0.tar.gz
          containerconfiglabels:
            - "com.docker.compose.project": svacer
          container:
            config:
              env:
                - THEIA_WEBVIEW_EXTERNAL_ENDPOINT={{hostname}}
            hostconfig:
              autoremove: true
              portbindings:
                "3000/tcp":
                  - hostport: 0
                    hostip: 172.17.0.1 # ip-адрес интерфейса хоста docker0
        manager:
          type: default
      default:
        <<: *1-46-0
        order: 0
        disabled: false
Проверить актуальные значения аргументов инструкции CMD docker-образа можно с помощью команды docker image inspect {имя образа}
docker-compose.yml
Изменены внесены в файл docker-compose.yml
services:
  postgresql:
    image: postgres:17.0-bullseye
    container_name: svacer-postgres
    restart: always
    shm_size: 1g
    environment:
      - POSTGRES_DB=svace
      - POSTGRES_USER=svace
      - POSTGRES_PASSWORD=svace
      - POSTGRES_ROOT_PASSWORD=svace
    volumes:
      - svacer-postgres:/var/lib/postgresql/data
    networks:
      svacer:
    healthcheck:
      test: pg_isready -U svace
      interval: 8s
      start_period: 16s
      timeout: 4s
      retries: 4

  svacer:
    image: ispras/svacer:10-0-0
    container_name: svacer
    restart: always
    shm_size: 1g
    depends_on:
      postgresql:
        condition: service_healthy
    ports:
      - "3002:3002"
      - "8080:8080"
    environment:
      - SVACER_PG_URL=postgres://svace:svace@postgresql:5432/svace
      - STORE=/data/store
    volumes:
      - svacer-object-store:/data/store
      - /var/run/docker.sock:/var/run/docker.sock:ro # доступ к API docker'а из контейнера Svacer
      - ./svacer.cfg:/svacer/bin/svacer.cfg:ro # привязка конфигурационного файла svacer.cfg
      - /data/snapshot-sources:/data/snapshot-sources # writable привязка коневой папки с исходниками снимков. Пути до и после ":" должны совпадать.
    networks:
      svacer:
    healthcheck:
      test: curl --fail http://localhost:8080/api/health || exit 1
      interval: 8s
      start_period: 16s
      timeout: 4s
      retries: 4

volumes:
  svacer-postgres:
  svacer-object-store:

networks:
  svacer:

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

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

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

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