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