【问题标题】:Running plumber API on Docker container在 Docker 容器上运行管道工 API
【发布时间】:2020-12-16 19:31:52
【问题描述】:

我想在 Docker 容器上运行管道工 API。

我尝试了以下两个dockerfile:

第一个 Dockerfile

FROM rstudio/plumber
MAINTAINER Docker User <docker@user.org>
RUN R -e "install.packages('broom')"
RUN mkdir -p ~/application

# copy everything from the current directory into the container
COPY "/" "application/"
WORKDIR "application/" 

# open port 80 to traffic
EXPOSE 80

# when the container starts, start the main.R script
ENTRYPOINT ["Rscript", "execute_plumber.R"]

第二个 Dockerfile:

FROM rocker/r-ver:4.0.2

# install the linux libraries needed for plumber
RUN apt-get update -qq && apt-get install -y \
  libssl-dev \
  libcurl4-gnutls-dev

# install plumber
RUN R -e "install.packages('plumber')"
RUN mkdir -p ~/application

# copy everything from the current directory into the container
COPY "/" "application/"
WORKDIR "application/" 

# open port 80 to traffic
EXPOSE 80

# when the container starts, start the main.R script
ENTRYPOINT ["Rscript", "execute_plumber.R"]

它们都导致了以下错误:

* Downloading renv 0.12.0 from CRAN archive ... OK
* Installing renv 0.12.0 ... Done!
Successfully installed and loaded renv 0.12.0.
Error in library(plumber) : there is no package called ‘plumber’
Execution halted

在第二个 Dockerfile 的情况下,我还尝试安装不同的 linux 库,例如

git-core
libcurl4-openssl-dev
xml2 openssl

他们都没有帮助。

我在 Azure 上运行它。有什么建议吗?

更新 在容器构建日志文件中,我可以清楚地看到plumber 已成功安装。

> install.packages('plumber')
Installing package into ‘/usr/local/lib/R/site-library’
(as ‘lib’ is unspecified)
also installing the dependencies ‘curl’, ‘Rcpp’, ‘later’, ‘BH’, ‘rlang’, ‘glue’, ‘R6’, ‘stringi’, ‘jsonlite’, ‘webutils’, ‘httpuv’, ‘crayon’, ‘promises’, ‘sodium’, ‘swagger’, ‘magrittr’, ‘mime’, ‘lifecycle’

...

* DONE (plumber)

【问题讨论】:

    标签: r azure docker containers plumber


    【解决方案1】:

    在这个输出中:

    > install.packages('plumber')
    Installing package into ‘/usr/local/lib/R/site-library’
    (as ‘lib’ is unspecified)
    also installing the dependencies ‘curl’, ‘Rcpp’, ‘later’, ‘BH’, ‘rlang’, ‘glue’, ‘R6’, ‘stringi’, ‘jsonlite’, ‘webutils’, ‘httpuv’, ‘crayon’, ‘promises’, ‘sodium’, ‘swagger’, ‘magrittr’, ‘mime’, ‘lifecycle’
    
    ...
    
    * DONE (plumber)
    

    看起来软件包正在安装到 R 站点库中,但在这里:

    * Downloading renv 0.12.0 from CRAN archive ... OK
    * Installing renv 0.12.0 ... Done!
    Successfully installed and loaded renv 0.12.0.
    Error in library(plumber) : there is no package called ‘plumber’
    Execution halted
    

    项目的 renv 自动加载器(通常是项目 .Rprofile 的一部分)正在运行,这会将您的项目设置为使用私有库路径(与您的站点库隔离)。

    我怀疑您可以通过重新组织 Dockerfile 中的命令来解决此问题;例如

    FROM rocker/r-ver:4.0.2
    
    # install the linux libraries needed for plumber
    RUN apt-get update -qq && apt-get install -y \
      libssl-dev \
      libcurl4-gnutls-dev
    
    # create the application folder
    RUN mkdir -p ~/application
    
    # copy everything from the current directory into the container
    COPY "/" "application/"
    WORKDIR "application/" 
    
    # open port 80 to traffic
    EXPOSE 80
    
    # install plumber
    RUN R -e "install.packages('plumber')"
    
    # when the container starts, start the main.R script
    ENTRYPOINT ["Rscript", "execute_plumber.R"]
    

    换句话说,确保在设置工作目录后调用install.packages("plumber")

    【讨论】:

    • 谢谢,我会试一试,但我认为COPY命令会失败,因为RUN mkdir -p ~/application只是稍后执行,目录还不存在
    • 对不起,是的——该命令应该提前移动。我将编辑我的回复。
    • 谢谢,您的建议奏效了。容器现在正在运行,现在我需要能够访问我的 API,但这是不同的问题
    猜你喜欢
    • 2022-08-15
    • 2017-12-20
    • 2020-12-14
    • 2017-07-16
    • 2019-12-05
    • 2022-08-16
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多