Mic*_*zes 6 r environment-variables shiny docker shiny-server
我有一个正在运行的Docker容器,带有略微修改过的rocker/shiny图像中的闪亮服务器.
默认shiny-server.conf文件将闪亮用户设置为下面的用户
# Define the user we should use when spawning R Shiny processes
run_as shiny;
Run Code Online (Sandbox Code Playgroud)
表示服务器默认以root身份运行,但闪亮应用程序的工作进程以用户闪亮的方式运行
应用程序本身使用与SQL Server的数据仓库连接,通过RODBC初始化.虽然我们不想将整个连接详细信息字符串(包括数据库主机和密码)放入代码库中,但我们希望通过运行以下例程从创建容器的环境变量中读取它们
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)
Run Code Online (Sandbox Code Playgroud)
问题是,当用户闪亮时,在容器内生成工作进程时,这些env变量为空.
如果我尝试在交互式R控制台中运行相同的代码(作为root用户或闪亮用户),我会按预期获得env变量.
任何输入都将非常感激.请注意我不打算使用docker机密,因为我没有在docker swarm集群中运行应用程序,只是一个独立的Rancher OS主机.
编辑:虽然.Renviron文件可能是解决该特定问题的可行替代方案,但它需要将变量放入代码库中,我们在此尝试避免这种情况.
我在shiny-server.sh开始脚本中添加了以下内容,这是Docker容器的CMD,正如Ralf Stubner所建议的那样
env > /home/shiny/.Renviron
chown shiny.shiny /home/shiny/.Renviron
Run Code Online (Sandbox Code Playgroud)