Oi,
Eu tenho um aplicativo Glossproxy funcionando com autenticação ldap. No entanto, para recuperar dados do banco de dados SQL, agora uso (não recomendado) uma cadeia de conexões codificada no meu código R com as credenciais mencionadas aqui (eu uso um usuário de serviço porque meus usuários finais não têm permissão para consultar o banco de dados):
con <- DBI::dbConnect(odbc::odbc(), encoding = "latin1", .connection_string = 'Driver={Driver};Server=Server;Database=dbb;UID=UID;PWD=PWD')
Tentei substituir essa string de conexão por uma variável de ambiente, que passo do meu host linux para o contêiner. O código R agora mudou para:
connString <- Sys.getenv("CONNSTRING")
connString <- sub("\\\\","\\", connString)
con <- DBI::dbConnect(odbc::odbc(), encoding = "latin1", .connection_string = connString)
Isso funciona bem ao executar o contêiner fora do ShinyProxy e, portanto, ao passar as variáveis ambientais no tempo de execução com o seguinte comando docker:
docker run -it --env-file .env.list app123
A variável de ambiente também é encontrada ao entrar no contêiner em execução e digitar 'env'.
No entanto, ao usar ShinyProxy, não está claro para mim como configurar isso no arquivo de configuração yaml e no comando bash em tempo de execução. Como defino o parâmetro container-env-file para o app container? E como passo a instrução --env-file .env.list em tempo de execução para que seja coletada nos contêineres vinculados?
Meu aplicativo yaml agora se parece com isto (eu deixei intencionalmente a configuração do ldap em branco):
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
Em seguida, executo o seguinte comando para iniciar o contêiner 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
Um problema relacionado é encontrado aqui , mas este usa um Docker compose.yml. É possível configurar coisas sem um Docker Compose? O que estou perdendo?
Qualquer ajuda bem-vinda!
Olá @Bertusian ,
Acho que o problema é que você está executando o próprio Glossproxy em um contêiner, então você precisa disponibilizar o seu arquivo .env.list
dentro desse contêiner (por montagem de volume), ou alternativamente usar container-env
com env vars que você passa via arquivo em seu comando docker run. Além disso, acredito que container-env-file
espera um caminho absoluto.
Olá @ mnazarov.
Na verdade, estou executando o brightproxy em um contêiner. Você pode eventualmente fornecer um exemplo do comando runtime para lançar o contêiner brilhante (com o volume .env.list montado), e ele é então capturado pelo contêiner R-app? Pensei que o .env.list foi disponibilizado adicionando --env-file ~ / .env.list (que funcionou ao executar o contêiner sem brilhanteproxy).
E ainda preciso adaptar o application.yml? Ainda não está muito claro para mim. Grato por qualquer ajuda ou um exemplo ...
Vou tentar explicar mais claramente: você tem um sistema host e 2 contêineres: um externo onde o Glossproxy está rodando e um interno com o seu aplicativo.
Ao executar docker run --env-file ...
em seu sistema host, você torna as variáveis de ambiente desse arquivo no sistema host disponíveis para o contêiner externo como env vars. Agora você pode passá-los para o contêiner interno usando a variável container-env
.
Alternativamente, você pode montar a pasta host com seu arquivo em seu contêiner externo e, em seguida, tornar os env vars desse arquivo disponíveis em seu contêiner interno usando a variável container-env-file
.
Um exemplo de comando para a 2ª alternativa pode ser algo como:
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
assumindo que seu arquivo .env.list está localizado em / home / envs / em seu host - você o disponibiliza no contêiner externo em /tmp/envs/env.list com montagem de volume - agora você pode usar container-env-file: /tmp/envs/.env.list
em seu application.yml
Um exemplo para a 1ª alternativa é usar seu comando original e, em seguida, em application.yaml, use container-env
com algo como:
container-env:
VAR11: "${VAR1}"
VAR22: "${VAR2}"
onde VAR1 e VAR2 são env vars definidos no arquivo no host e, portanto, disponíveis como env vars no contêiner externo, e aqui você os passa para o contêiner interno como VAR11 e VAR22 (por exemplo, você pode, é claro, usar os mesmos nomes também )
OH MEU DEUS. Isso é ótimo! Agora funciona. Não tentei a primeira sugestão (mas tentarei depois), mas sua segunda solução acertou direto! Eu sabia que estava perto, mas não conseguia encontrar.
Muito obrigado!!
Ótimas coisas que vocês estão fazendo com o ShinyProxy.
Estou feliz que funcionou!
Comentários muito úteis
Vou tentar explicar mais claramente: você tem um sistema host e 2 contêineres: um externo onde o Glossproxy está rodando e um interno com o seu aplicativo.
Ao executar
docker run --env-file ...
em seu sistema host, você torna as variáveis de ambiente desse arquivo no sistema host disponíveis para o contêiner externo como env vars. Agora você pode passá-los para o contêiner interno usando a variávelcontainer-env
.Alternativamente, você pode montar a pasta host com seu arquivo em seu contêiner externo e, em seguida, tornar os env vars desse arquivo disponíveis em seu contêiner interno usando a variável
container-env-file
.Um exemplo de comando para a 2ª alternativa pode ser algo como:
assumindo que seu arquivo .env.list está localizado em / home / envs / em seu host - você o disponibiliza no contêiner externo em /tmp/envs/env.list com montagem de volume - agora você pode usar
container-env-file: /tmp/envs/.env.list
em seu application.ymlUm exemplo para a 1ª alternativa é usar seu comando original e, em seguida, em application.yaml, use
container-env
com algo como:onde VAR1 e VAR2 são env vars definidos no arquivo no host e, portanto, disponíveis como env vars no contêiner externo, e aqui você os passa para o contêiner interno como VAR11 e VAR22 (por exemplo, você pode, é claro, usar os mesmos nomes também )