我正在通过 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'))"
…
但是,坦率地说,这很难读。更好的方法是使用 ARG
或 ENV
提供要安装的包(这与我们是否使用“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/