使用没有入口点的 Docker 镜像来服务 R 管道工 API

问题描述

我使用 geospatial rocker2 image 部署 Rstudio 进行开发,并使用 Shiny 应用程序进行生产。通过使用单个图像,我拥有一致的包库、凭据和数据库连接。我想使用相同的图像来为管道工 API 提供服务。

使用标准 plumber.R examplestandard 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文件显然是来源,但它没有被“探测”:

Terminal output

一个问题是容器不断重启(这是 docker ps 的输出 - 请忽略正在运行的 node.js 容器):

Output of docker ps

还有一个奇怪的地方是没有显示端口 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。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...