在容器中生成闪亮进程时保留环境变量
Preserve environment variables when spawning shiny processes within a container
我有一个 运行ning Docker 容器,其中包含来自稍微修改过的 rocker/shiny
映像的闪亮服务器。
默认 shiny-server.conf
文件将 shiny 用户设置为
下的用户
# Define the user we should use when spawning R Shiny processes
run_as shiny;
表示服务器默认 运行 以 root 身份运行,但 shiny 应用程序的工作进程 运行 作为用户 shiny
应用程序本身使用数据仓库连接到 SQL 服务器,通过 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)
问题是,当工作进程作为用户 shiny 在容器中生成时,这些环境变量为空。
如果我尝试 运行 交互式 R 控制台中的相同代码(作为 root 或 shiny 用户) 我得到了预期的环境变量。
如有任何意见,我们将不胜感激。请注意,我不打算使用 docker 秘密,因为我不是 运行 在 docker swarm 集群中安装应用程序,只是一个独立的 Rancher OS 主机。
编辑:
虽然 .Renviron 文件可能是解决该特定问题的可行替代方案,但它需要将变量放入代码库中,而我们在此试图避免这种情况。
我在 shiny-server.sh
启动脚本中添加了以下内容,这是 docker 容器的 CMD,正如 Ralf Stubner
所建议的
env > /home/shiny/.Renviron
chown shiny.shiny /home/shiny/.Renviron
我有一个 运行ning Docker 容器,其中包含来自稍微修改过的 rocker/shiny
映像的闪亮服务器。
默认 shiny-server.conf
文件将 shiny 用户设置为
# Define the user we should use when spawning R Shiny processes
run_as shiny;
表示服务器默认 运行 以 root 身份运行,但 shiny 应用程序的工作进程 运行 作为用户 shiny
应用程序本身使用数据仓库连接到 SQL 服务器,通过 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)
问题是,当工作进程作为用户 shiny 在容器中生成时,这些环境变量为空。
如果我尝试 运行 交互式 R 控制台中的相同代码(作为 root 或 shiny 用户) 我得到了预期的环境变量。
如有任何意见,我们将不胜感激。请注意,我不打算使用 docker 秘密,因为我不是 运行 在 docker swarm 集群中安装应用程序,只是一个独立的 Rancher OS 主机。
编辑: 虽然 .Renviron 文件可能是解决该特定问题的可行替代方案,但它需要将变量放入代码库中,而我们在此试图避免这种情况。
我在 shiny-server.sh
启动脚本中添加了以下内容,这是 docker 容器的 CMD,正如 Ralf Stubner
env > /home/shiny/.Renviron
chown shiny.shiny /home/shiny/.Renviron