Привет,
У меня есть работающее приложение 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? Что мне не хватает?
Любая помощь приветствуется!
Привет @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.
Я рад, что это сработало!
Самый полезный комментарий
Я постараюсь объяснить более четко: у вас есть хост- система и 2 контейнера: один внешний, где работает shinyproxy, и один внутренний с вашим приложением.
Запустив
docker run --env-file ...
в вашей хост-системе, вы делаете переменные среды из этого файла в хост-системе доступными для внешнего контейнера как переменные env. Теперь вы можете передать их во внутренний контейнер, используя переменнуюcontainer-env
.В качестве альтернативы вы можете смонтировать папку хоста с вашим файлом во внешний контейнер, а затем вы можете сделать переменные env из этого файла доступными во внутреннем контейнере, используя переменную
container-env-file
.Пример команды для второй альтернативы может выглядеть примерно так:
предполагая, что ваш файл .env.list находится в / home / envs / на вашем хосте - вы делаете его доступным во внешнем контейнере в /tmp/envs/env.list с монтированием тома - теперь вы можете использовать
container-env-file: /tmp/envs/.env.list
в вашем application.ymlПримером 1-й альтернативы является использование вашей исходной команды, а затем в application.yaml использование
container-env
с чем-то вроде:где VAR1 и VAR2 - переменные env, определенные в файле на хосте и, следовательно, доступные как переменные env во внешнем контейнере, и здесь вы передаете их внутреннему контейнеру как VAR11 и VAR22 (например, вы, конечно, также можете использовать те же имена )