如何在docker中加速R包安装

Ana*_*rKi 2 r docker dockerfile

假设您要为docker镜像安装以下软件包列表

("jsonlite","dplyr","stringr","tidyr","lubridate",
"knitr","purrr","tm","cba","caret",
"plumber","httr")
Run Code Online (Sandbox Code Playgroud)

安装这些实际上需要大约1个小时!

有关如何加速这样的事情的任何建议?(或者如何防止在每次新图像构建时重新安装?)

边注

我不会像这样从dockerfile安装这些软件包:

RUN Rscript -e "install.packages('stringr')
...
Run Code Online (Sandbox Code Playgroud)

相反,我创建了一个R脚本Requirements.R来安装这些包,并简单地执行:

RUN Rscript Requirements.R
Run Code Online (Sandbox Code Playgroud)

这些不是直接从Dockerfile安装软件包的最佳选择吗?

Jod*_*iug 12

我找到了一篇文章,描述了如何从预编译的二进制文件中安装 R 包。它将我们 Jenkins 服务器上的构建时间从 45 分钟减少到 3 分钟。

这是我的Dockerfile

FROM rocker/r-apt:bionic
WORKDIR /app
RUN apt-get update && \
  apt-get install -y libxml2-dev

# Install binaries (see https://datawookie.netlify.com/blog/2019/01/docker-images-for-r-r-base-versus-r-apt/)
COPY ./requirements-bin.txt .
RUN cat requirements-bin.txt | xargs apt-get install -y -qq

# Install remaining packages from source
COPY ./requirements-src.R .
RUN Rscript requirements-src.R

# Clean up package registry
RUN rm -rf /var/lib/apt/lists/*

COPY ./src /app

EXPOSE 5000
CMD ["Rscript", "Server.R"]
Run Code Online (Sandbox Code Playgroud)

您可以添加requirements-bin.txt带有包名称的文件:

r-cran-plumber
r-cran-quanteda
r-cran-irlba
r-cran-lsa
r-cran-caret
r-cran-stringr
r-cran-dplyr
r-cran-magrittr
r-cran-randomforest
Run Code Online (Sandbox Code Playgroud)

最后,requirements-src.R对于不能作为二进制文件提供的软件包:

pkgs <- c(
    'otherpackage'
)

install.packages(pkgs)
Run Code Online (Sandbox Code Playgroud)

  • 这为我们节省了数年的构建时间。应该被标记为这个问题的解决方案。 (2认同)

Dir*_*tel 7

使用二进制包,你可以像往常一样在Rocker Project中为R提供多个Docker文件,包括官方的r-base文件.

如果你从Ubuntu开始,那么迈克尔的PPA将拥有超过3000个套餐; 如果你从Debian开始,你可以从发行版中获得更少的内容,但仍然可以使用很多基本内容 (有一些努力为Debian带来了更多的二进制包,但现在什么都没有.)

最后,Dockerfile的创建当然也是编译时间.您花了一次时间(每个容器创建)并在之后的许多时间重复使用.此外,通过使用Docker Hub,您可以避免花费本地cpu周期.

  • 当然。对于 Ubuntu,指向 Rutter PPA 并使用它;我在我的 r-travis 存储库中这样做(在 Docker 之外)。我只是提交了一些这样做的 Dockerfile,例如参见 [​​this one for Rcpp](https://github.com/RcppCore/Rcpp/blob/master/docker/Dockerfile)——它从 Debian 安装了多个包作为` r-cran-*` 二进制文件和来自 CRAN 的两个不可用的二进制包。 (2认同)