问题描述
我使用 geospatial rocker2 image 部署 Rstudio 进行开发,并使用 Shiny 应用程序进行生产。通过使用单个图像,我拥有一致的包库、凭据和数据库连接。我想使用相同的图像来为管道工 API 提供服务。
使用标准 plumber.R example 和 standard plumber Docker example,我尝试如下提供:
docker run -v `pwd`/app/plumber.R:/plumber.R --name plumber --restart=unless-stopped \
-p 8000:8000 my_rocker2_fork/geospatial Rscript /plumber.R
成功,有点。管道工.R文件显然是来源,但它没有被“探测”:
另一个问题是容器不断重启(这是 docker ps 的输出 - 请忽略正在运行的 node.js 容器):
还有一个奇怪的地方是没有显示端口 8000。有时是,有时不是。我认为这与重新启动行为有关。
我的代码没有经过检测,因为我没有 rstudio/plumber Dockerfile 中的标准入口点,而且我认为我不想要这个入口点,因为它可能会导致 Rstudio Server 和闪亮的应用程序也在这张图片中。因此,我认为通过在我的 Docker run 语句末尾扩展 Rscript 命令来“探测”可能是最佳的:
docker run -v `pwd`/app/plumber.R:/plumber.R -p 8000:8000 my_rocker2_fork/geospatial \
'Rscript pr("/plumber.R") %>% pr_run(port = 8000)' &
但是,由于所有特殊字符(如管道运算符),这会失败。如何在没有入口点的情况下使用任意 Dockerfile 提供管道工代码?
解决方法
答案很简单!调用设置管道运动的脚本,例如
docker run -v `pwd`/app/plumb_start.R:/plumb_start.R -p 8000:8000 my_rocker2_fork/geospatial \
Rscript plumb_start.R
其中 plumb_start.R 包含:
pr("plumber.R") %>% pr_run(port=8000)
确保您还在 Dockerfile 中公开端口 8000。