【问题标题】:Preserve environment variables when spawning shiny processes within a container在容器中生成闪亮的进程时保留环境变量
【发布时间】: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 控制台中运行相同的代码(作为 rootshiny 用户),我将按预期获得环境变量。

任何意见将不胜感激。请注意,我不打算使用 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


【解决方案1】:

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

env > /home/shiny/.Renviron
chown shiny.shiny /home/shiny/.Renviron

【讨论】:

    猜你喜欢
    • 2017-01-15
    • 2015-11-12
    • 1970-01-01
    • 2013-01-22
    • 2021-10-10
    • 1970-01-01
    • 2020-02-16
    • 1970-01-01
    • 2012-01-27
    相关资源
    最近更新 更多