你好,
我有一个带有 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
在这里找到
任何帮助表示感谢!
嗨@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 做的很棒的事情。
我很高兴它奏效了!
最有用的评论
我将尝试更清楚地解释:您有一个主机系统和 2 个容器:一个在外部运行 Shinyproxy,另一个在您的应用程序内部。
通过在您的主机系统上运行
docker run --env-file ...
,您可以将主机系统上该文件的环境变量作为 env vars 提供给外部容器。 现在您可以使用container-env
变量将它们进一步传递到内部容器。或者,您可以将带有文件的主机文件夹安装到外部容器中,然后您可以使用
container-env-file
变量使该文件中的环境变量在内部容器中可用。第二种选择的示例命令可能类似于:
假设您的 .env.list 文件位于主机上的 /home/envs/ - 您可以在 /tmp/envs/env.list 下的外部容器中使用卷挂载 - 现在您可以使用
container-env-file: /tmp/envs/.env.list
在您的 application.yml 中第一种选择的示例是使用您的原始命令,然后在 application.yaml 中使用
container-env
和类似的内容:其中 VAR1 和 VAR2 是在主机上的文件中定义的环境变量,因此可用作外部容器中的环境变量,在这里您将它们作为 VAR11 和 VAR22 传递给内部容器(例如,您当然也可以使用相同的名称)