如何加快Docker中R软件包的安装

时间:2018-07-24 13:51:22

标签: r docker dockerfile

说您有以下要为Docker映像安装的软件包列表

("jsonlite","dplyr","stringr","tidyr","lubridate",
"knitr","purrr","tm","cba","caret",
"plumber","httr")

实际上安装它们大约需要1个小时!

有人建议如何加快这种速度吗? (或如何防止在每次创建新映像时都重新安装?)

旁注

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

RUN Rscript -e "install.packages('stringr')
...

相反,我创建了一个R脚本Requirements.R,该脚本将安装这些软件包并执行以下操作:

RUN Rscript Requirements.R

与直接从Dockerfile安装软件包相比,这些工具不是最佳选择吗?

3 个答案:

答案 0 :(得分:6)

使用 binary软件包,就像我们在Rocker Project中经常使用的那样,为R提供多个Docker文件,包括官方的基于r的文件。

如果您是从Ubuntu开始的,您将获得Michael's PPAs,其中包含3000多个软件包;如果您从Debian开始,那么从发行版中获得的收益会更少,但仍然有许多基本发行版。 (有一些努力将更多的二进制软件包引入Debian,但目前尚无任何进展。)

最后,创建Dockerfile当然也是编译时。您花费一次时间(每次创建容器),然后可能重复使用很多时间。另外,通过使用Docker Hub,您可以避免花费本地的CPU周期。

答案 1 :(得分:1)

我最终按照@DirkEddelbuettel的建议使用了rocker / r-base。同样,由于这个How to avoid reinstalling packages when building Docker image for Python projects?,我以一种在每次重建Docker映像时都不会重新安装软件包的方式编写Dockerfile。

我想分享我的Dockerfile现在的样子,希望这对其他人有帮助:

FROM rocker/r-base

RUN apt-get update

# install packages 
RUN apt-get -y install libcurl4-openssl-dev
RUN apt-get -y install libssl-dev

# set work directory 
WORKDIR /myapp

# copy requirments R script
COPY ./Requirements.R /myapp/Requirements.R

# run requirments R script
RUN Rscript Requirements.R

COPY . /myapp

EXPOSE 8094

ENV NAME R-test-service

CMD ["Rscript", "my_R_api.R"]

答案 2 :(得分:0)

我发现一个better method比上面的要多。通过使用预编译的二进制文件,它将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"]

您可以添加文件名为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

最后,一个requirements-src.R用于不能作为binairies使用的软件包:

pkgs <- c(
    'otherpackage'
)

install.packages(pkgs)