Shinyproxy: Передача учетных данных SQL во время выполнения с помощью shinyproxy application.yml

Созданный на 27 окт. 2020  ·  5Комментарии  ·  Источник: openanalytics/shinyproxy

Привет,

У меня есть работающее приложение shinyproxy с аутентификацией ldap. Однако для извлечения данных из базы данных SQL я теперь использую (не рекомендуется) жестко запрограммированную строку подключения в моем коде R с учетными данными, упомянутыми здесь (я использую пользователя службы, потому что у моих конечных пользователей нет разрешений на запросы к базе данных):

con <- DBI::dbConnect(odbc::odbc(), encoding = "latin1", .connection_string = 'Driver={Driver};Server=Server;Database=dbb;UID=UID;PWD=PWD') 

Я попытался заменить эту строку подключения переменной окружения, которую я передаю с моего хоста Linux в контейнер. Код R теперь изменен на:

connString <- Sys.getenv("CONNSTRING")
connString <- sub("\\\\","\\", connString)
con <- DBI::dbConnect(odbc::odbc(), encoding = "latin1", .connection_string = connString)

Это отлично работает при запуске контейнера за пределами ShinyProxy и, таким образом, путем передачи переменных среды во время выполнения с помощью следующей команды docker:

docker run -it --env-file .env.list app123 

Переменная окружения также находится при входе в работающий контейнер и вводе «env».

Однако при использовании ShinyProxy мне непонятно, как настроить это в файле конфигурации yaml и в команде bash во время выполнения. Как определить параметр container-env-file для контейнера приложения? И как передать оператор --env-file .env.list во время выполнения, чтобы он находился в связанных контейнерах?

Теперь мое приложение yaml выглядит так (я намеренно оставил пустую конфигурацию ldap):

proxy:
  port: 8080
  authentication: ldap
  admin-groups: admins
  ldap:
    url: url
    manager-dn: manager-dn
    manager-password: manager-password
    user-search-base: user-search-base
    user-search-filter: user-search-filter
    group-search-filter:  group-search-filter
    group-search-base: group-search-base  
  docker:
      internal-networking: true
  specs:
  - id: 01_ok
    display-name: dashboard
    description: Dashboard 
    container-cmd: ["R", "-e", "shiny::runApp('/root/R')"]
    container-image: hberten/app123
    container-env-file: .env.list
    container-network: shineyproxyn-net
    access-groups: [GG_APP_ShinyProxy]

logging:
  file:
    shinyproxy.log

Затем я запускаю следующую команду, чтобы запустить контейнер ShinyProxy:

sudo docker run -d --env-file ~/.env.list -v /var/run/docker.sock:/var/run/docker.sock --net shineyproxyn-net -p 8080:8080 hberten/shinyproxy

Связанный с этим вопрос находится здесь , но это один использует compose.yml Докер. Можно ли настраивать вещи без Docker Compose? Что мне не хватает?

Любая помощь приветствуется!

question

Самый полезный комментарий

Я постараюсь объяснить более четко: у вас есть хост- система и 2 контейнера: один внешний, где работает shinyproxy, и один внутренний с вашим приложением.
Запустив docker run --env-file ... в вашей хост-системе, вы делаете переменные среды из этого файла в хост-системе доступными для внешнего контейнера как переменные env. Теперь вы можете передать их во внутренний контейнер, используя переменную container-env .
В качестве альтернативы вы можете смонтировать папку хоста с вашим файлом во внешний контейнер, а затем вы можете сделать переменные env из этого файла доступными во внутреннем контейнере, используя переменную container-env-file .

Пример команды для второй альтернативы может выглядеть примерно так:

sudo docker run -d -v /home/envs:/tmp/envs -v /var/run/docker.sock:/var/run/docker.sock --net shineyproxyn-net -p 8080:8080 hberten/shinyproxy

предполагая, что ваш файл .env.list находится в / home / envs / на вашем хосте - вы делаете его доступным во внешнем контейнере в /tmp/envs/env.list с монтированием тома - теперь вы можете использовать container-env-file: /tmp/envs/.env.list в вашем application.yml

Примером 1-й альтернативы является использование вашей исходной команды, а затем в application.yaml использование container-env с чем-то вроде:

container-env:
  VAR11: "${VAR1}"
  VAR22: "${VAR2}"

где VAR1 и VAR2 - переменные env, определенные в файле на хосте и, следовательно, доступные как переменные env во внешнем контейнере, и здесь вы передаете их внутреннему контейнеру как VAR11 и VAR22 (например, вы, конечно, также можете использовать те же имена )

Все 5 Комментарий

Привет @Bertusian!
Я думаю, проблема в том, что вы запускаете shinyproxy в контейнере, поэтому вам нужно сделать свой файл .env.list доступным внутри этого контейнера (путем его установки тома) или, в качестве альтернативы, использовать container-env с env vars, которые вы передаете через файл в команде запуска докера. Кроме того, я считаю, что container-env-file ожидает абсолютный путь.

Привет @ mnazarov.

Действительно, я запускаю shinyproxy в контейнере. Можете ли вы в конечном итоге предоставить пример команды времени выполнения для запуска контейнера shinyproxy (с установленным томом .env.list), и захватывается ли он затем контейнером R-app? Я думал, что .env.list стал доступным путем добавления --env-file ~ / .env.list (который работал при запуске контейнера без shinyproxy).
И нужно ли еще адаптировать application.yml? Мне все еще не очень понятно. Благодарен за любую помощь или пример ...

Я постараюсь объяснить более четко: у вас есть хост- система и 2 контейнера: один внешний, где работает shinyproxy, и один внутренний с вашим приложением.
Запустив docker run --env-file ... в вашей хост-системе, вы делаете переменные среды из этого файла в хост-системе доступными для внешнего контейнера как переменные env. Теперь вы можете передать их во внутренний контейнер, используя переменную container-env .
В качестве альтернативы вы можете смонтировать папку хоста с вашим файлом во внешний контейнер, а затем вы можете сделать переменные env из этого файла доступными во внутреннем контейнере, используя переменную container-env-file .

Пример команды для второй альтернативы может выглядеть примерно так:

sudo docker run -d -v /home/envs:/tmp/envs -v /var/run/docker.sock:/var/run/docker.sock --net shineyproxyn-net -p 8080:8080 hberten/shinyproxy

предполагая, что ваш файл .env.list находится в / home / envs / на вашем хосте - вы делаете его доступным во внешнем контейнере в /tmp/envs/env.list с монтированием тома - теперь вы можете использовать container-env-file: /tmp/envs/.env.list в вашем application.yml

Примером 1-й альтернативы является использование вашей исходной команды, а затем в application.yaml использование container-env с чем-то вроде:

container-env:
  VAR11: "${VAR1}"
  VAR22: "${VAR2}"

где VAR1 и VAR2 - переменные env, определенные в файле на хосте и, следовательно, доступные как переменные env во внешнем контейнере, и здесь вы передаете их внутреннему контейнеру как VAR11 и VAR22 (например, вы, конечно, также можете использовать те же имена )

МОЙ БОГ. Отлично! Теперь это работает. Я не пробовал первое предложение (но сделаю позже), но ваше второе решение помогло! Я знал, что близко, но не мог его найти.

Большое тебе спасибо!!

Вы, ребята, делаете отличные вещи с ShinyProxy.

Я рад, что это сработало!

Была ли эта страница полезной?
0 / 5 - 0 рейтинги