【发布时间】:2018-12-07 09:59:39
【问题描述】:
我有一个正在运行的 Docker 容器,其中包含经过稍微修改的 rocker/shiny 映像的闪亮服务器。
默认的shiny-server.conf 文件将闪亮的用户设置为下面的用户
# Define the user we should use when spawning R Shiny processes
run_as shiny;
表示服务器默认以root身份运行,但闪亮应用的工作进程以用户身份运行shiny
应用程序本身使用通过 RODBC 初始化的与 SQL 服务器的数据仓库连接。虽然我们不想将整个连接详细信息字符串(包括 DB 主机和密码)放入代码库,但我们希望通过运行以下例程从创建容器的环境变量中读取它们
HOST <- Sys.getenv("host")
DB <- Sys.getenv("db")
UID <- Sys.getenv("uid")
PWD <- Sys.getenv("pwd")
conn<-paste0("driver={ODBC Driver 17 for SQL Server};server=",HOST,";database=",DB,";uid=",UID,";pwd=",PWD)
dbhandle<-odbcDriverConnect(conn)
问题是,当工作进程作为用户shiny 在容器中生成时,这些环境变量是空的。
如果我尝试在交互式 R 控制台中运行相同的代码(作为 root 或 shiny 用户),我将按预期获得环境变量。
任何意见将不胜感激。请注意,我不打算使用 docker secrets,因为我不是在 docker swarm 集群中运行应用程序,只是一个独立的 Rancher OS 主机。
编辑: 虽然 .Renviron 文件可能是解决该特定问题的可行替代方案,但它需要将变量放入代码库中,我们在这里试图避免这种情况。
【问题讨论】:
-
也许你没有在容器启动中传递 ENV 或者没有定义需要 ENV 作为 ENTRYPOINT 或 CMD 的进程
-
我确实在
docker run上传递了正确解释的--env-file - 我在容器中的 bash 中运行 printenv 作为两个用户 shiny 和 root,让变量按预期返回给我。 -
您可以使用
entrypoint从当时的环境中读取必要的变量并将它们写入.Renviron。
标签: r docker shiny environment-variables shiny-server