说您有以下要为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安装软件包相比,这些工具不是最佳选择吗?
答案 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)