r - 如何通过docker以并行方式安装R包?

标签 r docker dockerfile cran

我正在通过 docker 文件从 CRAN 安装几个 R 包。下面是我的 docker 文件:

FROM r-base:4.0.2
RUN apt-get update \
      && apt-get install -y --auto-remove \
      build-essential \
      libcurl4-openssl-dev \
      libpq-dev \
      libssl-dev \
      libxml2-dev \
      && R -e "system.time(install.packages(c('shiny', 'rmarkdown', 'Hmisc', 'rjson', 'caret','DBI', 'RPostgres','curl', 'httr', 'xml2', 'aws.s3'), repos='https://cloud.r-project.org/'))"
RUN mkdir /shinyapp
COPY . /shinyapp    
EXPOSE 5000
CMD ["R", "-e", "shiny::runApp('/shinyapp/src/shiny', port = 5000, host = '0.0.0.0')"]

docker 构建过程花费了太多时间(25 到 30 分钟)。以下是构建完成后的执行时间详细信息。

user   system  elapsed 
1306.268  232.438 1361.374 

上面的Dockerfile有什么办法可以优化吗?有什么方法可以并行安装包吗?

注意:我也试过rocker/r-base,但安装速度没有任何好转。

最佳答案

‘pak’并行执行包下载和安装。

不幸的是 current CRAN version of ‘pak’ (0.1.2.1) 可以说是坏了:它有的依赖。相比之下,GitHub 上的开发版本没有外部依赖,这是应该的。所以我们需要安装那个。

因此您可以按如下方式更改 Dockerfile:

…
 && Rscript -e "install.packages('pak', repos = 'https://r-lib.github.io/p/pak/dev/'); pak::pkg_install(c('shiny', 'rmarkdown', 'Hmisc', 'rjson', 'caret','DBI', 'RPostgres','curl', 'httr', 'xml2', 'aws.s3'))"
…

但是,坦率地说,这很难读。更好的方法是使用 ARGENV 提供要安装的包(这与我们是否使用“pak”来安装包无关):

FROM r-base:4.0.2

ARG PKGS="shiny, rmarkdown, Hmisc, rjson, caret, DBI, RPostgres, curl, httr, xml2, aws.s3"

RUN apt-get update \
 && apt-get install -y --auto-remove \
    build-essential \
    libcurl4-openssl-dev \
    libpq-dev \
    libssl-dev \
    libxml2-dev

RUN Rscript -e 'install.packages("pak", repos = "https://r-lib.github.io/p/pak/dev/")' \
 && echo "$PKGS" \
  | Rscript -e 'pak::pkg_install(strsplit(readLines("stdin"), ", ?")[[1L]])'

RUN mkdir /shinyapp
COPY . /shinyapp

EXPOSE 5000
CMD ["Rscript", "-e", "shiny::runApp('/shinyapp/src/shiny', port = 5000, host = '0.0.0.0')"]

另请注意,不应通过 R 二进制文件调用 R 以用于脚本用途——这就是 Rscript 的用途。除其他外,它可以更好地处理标准输出。

关于r - 如何通过docker以并行方式安装R包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65216178/

相关文章:

r - 在R中有效地提取逻辑矩阵中每行的第一个TRUE

docker - 在容器 : libGl error 内运行 Chromium

r - 对数据帧中特定值的总和进行高效重采样

r - 相关矩阵的热图或绘图

R 绘制相关图的下三角 (ggplot2)

docker - 将环境变量传递给Docker的最佳方法

docker - 如何使用用户 namespace 配置启动容器?

linux - 如何限制一组docker容器的内存资源?

docker - 旧文件保留在新的Docker容器中

mongodb - Mongo Docker 未创建用户