在容器中生成闪亮的进程时保留环境变量

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文件可能是解决该特定问题的可行替代方案,但它需要将变量放入代码库中,我们在此尝试避免这种情况.

Mic*_*zes 7

我在shiny-server.sh开始脚本中添加了以下内容,这是Docker容器的CMD,正如Ralf Stubner所建议的那样

env > /home/shiny/.Renviron
chown shiny.shiny /home/shiny/.Renviron
Run Code Online (Sandbox Code Playgroud)