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!
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!
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 Variablencontainer-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:
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.ymlEin 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: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 )