Shinyproxy: 在运行时使用 Shinyproxy application.yml 传递 SQL 凭据

创建于 2020-10-27  ·  5评论  ·  资料来源: openanalytics/shinyproxy

你好,

我有一个带有 ldap 身份验证的工作 Shinyproxy 应用程序。 但是,为了从 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-command 中配置它。 如何为应用程序容器定义参数 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

这里找到

任何帮助表示感谢!

question

最有用的评论

我将尝试更清楚地解释:您有一个主机系统和 2 个容器:一个在外部运行 Shinyproxy,另一个在您的应用程序内部
通过在您的主机系统上运行docker run --env-file ... ,您可以将主机系统上该文件的环境变量作为 env vars 提供给外部容器。 现在您可以使用container-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 中

第一种选择的示例是使用您的原始命令,然后在 application.yaml 中使用container-env和类似的内容:

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

其中 VAR1 和 VAR2 是在主机上的文件中定义的环境变量,因此可用作外部容器中的环境变量,在这里您将它们作为 VAR11 和 VAR22 传递给内部容器(例如,您当然也可以使用相同的名称)

所有5条评论

@Bertusian
我认为问题在于您在容器中运行 Shinyproxy 本身,因此您需要在该容器内提供.env.list文件(通过卷安装它),或者将container-env与 env 一起使用您通过 docker run 命令中的文件传递的变量。 另外,我相信container-env-file需要绝对路径。

嗨@姆纳扎罗夫。

事实上,我正在一个容器中运行 Shinyproxy。 您最终能否提供一个用于启动 Shinyproxy 容器(安装了 .env.list 卷)的运行时命令示例,然后它会被 R-app 容器捕获吗? 我认为 .env.list 是通过添加 --env-file ~/.env.list 来提供的(在没有shinyproxy的情况下运行容器时有效)。
我还需要调整 application.yml 吗? 对我来说仍然不是很清楚。 感谢任何帮助或例子......

我将尝试更清楚地解释:您有一个主机系统和 2 个容器:一个在外部运行 Shinyproxy,另一个在您的应用程序内部
通过在您的主机系统上运行docker run --env-file ... ,您可以将主机系统上该文件的环境变量作为 env vars 提供给外部容器。 现在您可以使用container-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 中

第一种选择的示例是使用您的原始命令,然后在 application.yaml 中使用container-env和类似的内容:

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

其中 VAR1 和 VAR2 是在主机上的文件中定义的环境变量,因此可用作外部容器中的环境变量,在这里您将它们作为 VAR11 和 VAR22 传递给内部容器(例如,您当然也可以使用相同的名称)

我的天啊。 这很棒! 现在它起作用了。 我还没有尝试过第一个建议(但稍后会尝试),但是您的第二个解决方案直接做到了! 我知道我很近,但找不到它。

非常感谢!!

你们用 ShinyProxy 做的很棒的事情。

我很高兴它奏效了!

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

PauloJhonny picture PauloJhonny  ·  8评论

donarus picture donarus  ·  3评论

jfrubioz picture jfrubioz  ·  9评论

erossini picture erossini  ·  3评论

algo-se picture algo-se  ·  6评论