Shinyproxy: Übergeben von SQL-Anmeldeinformationen zur Laufzeit mit der Shinyproxy-Anwendung.yml

Erstellt am 27. Okt. 2020  ·  5Kommentare  ·  Quelle: openanalytics/shinyproxy

Hi,

Ich habe eine funktionierende Shinyproxy-App mit LDAP-Authentifizierung. Zum Abrufen von Daten aus der SQL-Datenbank verwende ich jetzt jedoch (nicht empfohlen) einen hartcodierten Verbindungsstring in meinem R-Code mit den hier genannten Anmeldeinformationen (ich verwende einen Dienstbenutzer, da meine Endbenutzer keine Berechtigungen zum Abfragen der Datenbank haben):

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

Ich habe versucht, diese Verbindungszeichenfolge durch eine Umgebungsvariable zu ersetzen, die ich von meinem Linux-Host an den Container übergebe. Der R-Code hat sich jetzt geändert in:

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

Dies funktioniert gut, wenn der Container außerhalb von ShinyProxy ausgeführt wird und somit die Umgebungsvariablen zur Laufzeit mit dem folgenden Docker-Befehl übergeben werden:

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

Die Umgebungsvariable wird auch gefunden, wenn Sie den laufenden Container eingeben und 'env' eingeben.

Bei der Verwendung von ShinyProxy ist mir jedoch nicht klar, wie dies in der yaml-Konfigurationsdatei und im Bash-Befehl zur Laufzeit konfiguriert wird. Wie definiere ich den Parameter container-env-file für den App-Container? Und wie übergebe ich die Anweisung --env-file .env.list zur Laufzeit, damit sie in den verlinkten Containern abgeholt wird?

Meine Anwendungs-Yaml sieht jetzt so aus (ich habe die LDAP-Konfiguration absichtlich leer gelassen):

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

Ich führe dann den folgenden Befehl aus, um den ShinyProxy-Container zu starten:

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

Ein verwandtes Problem wird hier gefunden, aber dieses verwendet eine Docker-compose.yml. Ist es möglich, Dinge ohne Docker Compose zu konfigurieren? Was vermisse ich?

Jede mögliche Hilfe freundlich geschätzt!

question

Hilfreichster Kommentar

Ich werde versuchen, es klarer zu erklären: Sie haben ein Host- System und 2 Container: einen äußeren, in dem Shinyproxy ausgeführt wird, und einen inneren mit Ihrer App.
Durch Ausführen von docker run --env-file ... auf Ihrem Hostsystem machen Sie Umgebungsvariablen aus dieser Datei auf dem Hostsystem für den äußeren Container als env vars verfügbar. Jetzt können Sie sie mit der Variablen container-env weiter an den inneren Container übergeben.
Alternativ können Sie den Host-Ordner mit Ihrer Datei in Ihren äußeren Container einhängen und dann die env vars aus dieser Datei in Ihrem inneren Container verfügbar machen, indem Sie die Variable container-env-file .

Ein Beispielbefehl für die 2. Alternative könnte so aussehen:

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

vorausgesetzt, Ihre .env.list-Datei befindet sich in /home/envs/ auf Ihrem Host - Sie stellen sie im äußeren Container unter /tmp/envs/env.list mit Volume-Mount zur Verfügung - jetzt können Sie container-env-file: /tmp/envs/.env.list in Ihrer Anwendung.yml

Ein Beispiel für die erste Alternative besteht darin, Ihren ursprünglichen Befehl zu verwenden und dann in der application.yaml container-env mit etwas wie:

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

wobei VAR1 und VAR2 env vars sind, die in der Datei auf dem Host definiert sind und daher als env vars im äußeren Container verfügbar sind, und hier übergeben Sie sie als VAR11 und VAR22 an den inneren Container (zum Beispiel können Sie natürlich auch die gleichen Namen verwenden )

Alle 5 Kommentare

Hallo @Bertusian ,
Ich denke , das Problem ist , dass Sie shinyproxy sich in einem Container ausgeführt werden , so dass Sie Ihre brauchen , um .env.list Datei verfügbar innerhalb dieser Behälter (Volumen der Montage) oder alternativ verwenden container-env mit env vars, die Sie per Datei in Ihrem docker run-Befehl übergeben. Außerdem glaube ich, dass container-env-file einen absoluten Pfad erwartet.

Hallo @mnazarov.

Tatsächlich führe ich Shinyproxy in einem Container aus. Können Sie schließlich ein Beispiel für den Laufzeitbefehl zum Starten des Shinyproxy-Containers (mit eingehängtem .env.list-Volume) bereitstellen und wird er dann vom R-App-Container erfasst? Ich dachte, dass die .env.list durch Hinzufügen von --env-file ~/.env.list verfügbar gemacht wurde (das funktionierte, wenn der Container ohne Shinyproxy ausgeführt wurde).
Und muss ich die application.yml noch anpassen? Ist mir immer noch nicht ganz klar. Bin für jede Hilfe oder ein Beispiel dankbar...

Ich werde versuchen, es klarer zu erklären: Sie haben ein Host- System und 2 Container: einen äußeren, in dem Shinyproxy ausgeführt wird, und einen inneren mit Ihrer App.
Durch Ausführen von docker run --env-file ... auf Ihrem Hostsystem machen Sie Umgebungsvariablen aus dieser Datei auf dem Hostsystem für den äußeren Container als env vars verfügbar. Jetzt können Sie sie mit der Variablen container-env weiter an den inneren Container übergeben.
Alternativ können Sie den Host-Ordner mit Ihrer Datei in Ihren äußeren Container einhängen und dann die env vars aus dieser Datei in Ihrem inneren Container verfügbar machen, indem Sie die Variable container-env-file .

Ein Beispielbefehl für die 2. Alternative könnte so aussehen:

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

vorausgesetzt, Ihre .env.list-Datei befindet sich in /home/envs/ auf Ihrem Host - Sie stellen sie im äußeren Container unter /tmp/envs/env.list mit Volume-Mount zur Verfügung - jetzt können Sie container-env-file: /tmp/envs/.env.list in Ihrer Anwendung.yml

Ein Beispiel für die erste Alternative besteht darin, Ihren ursprünglichen Befehl zu verwenden und dann in der application.yaml container-env mit etwas wie:

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

wobei VAR1 und VAR2 env vars sind, die in der Datei auf dem Host definiert sind und daher als env vars im äußeren Container verfügbar sind, und hier übergeben Sie sie als VAR11 und VAR22 an den inneren Container (zum Beispiel können Sie natürlich auch die gleichen Namen verwenden )

OMG. Das ist toll! Jetzt gehts. Ich habe den ersten Vorschlag nicht ausprobiert (wird es später tun), aber Ihre zweite Lösung hat es auf Anhieb getan! Ich wusste, dass ich in der Nähe war, konnte es aber nicht finden.

Vielen Dank!!

Großartige Dinge, die Sie mit ShinyProxy machen.

freut mich, dass es funktioniert hat!

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen