R-3.4.4 的 Dockerfile,如何减少 docker 构建的时间,至少需要 30 分钟

Dockerfile for R-3.4.4, How to reduce the time of docker build, it takes at least 30 min

为了减小我的 Docker R 图像的大小,之前是 2G。我已经在一层中编写了安装和所有过程以及软件包的删除,这有助于减小图像大小。但是在 30 分钟到 45 分钟之间构建 docker 图像至少需要 30 分钟。如何减少时间

Docker文件

FROM centos
LABEL maintainer="admin.squad@xyz.com" \
  version="2.0" \
  project="xyz-R"
#EXPOSE 9988
ARG APP_HOME="/opt/deployment"
ARG PROJECT_NAME="xyz-R"
ENV LANG en_US.UTF-8
ENV APP_HOME=${APP_HOME} \
PROJECT_NAME=${PROJECT_NAME} \
PROJECT_HOME=${APP_HOME}/${PROJECT_NAME}

#RUN yum makecache
RUN yum install -y wget centos-release-scl bzip2-devel openssl- 
devel cyrus-sasl-devel libxml2-devel && \
yum install -y devtoolset-6 && \
source scl_source enable devtoolset-6 && \
export PATH=/opt/rh/devtoolset-6/root/bin:$PATH && \
rm -rf /var/cache/yum && \
mkdir packages1; cd packages1; wget -qO- https://downloads.sourceforge.net/project/libpng/zlib/1.2.8/zlib-1.2.8.tar.gz | tar zvx && \
cd zlib-1.2.8; ./configure; make; make install; cd .. && \
pwd && \
wget -qO- http://downloads.sourceforge.net/pcre/pcre-8.35.tar.gz | tar xzv && \
cd pcre-8.35; pwd; ./configure; make; make install; cd .. && \
wget -qO- http://tukaani.org/xz/xz-5.2.2.tar.gz | tar xzv && \
cd xz-5.2.2; ./configure; make; make install; cd .. && \
wget -qO- https://curl.haxx.se/download/curl-7.47.1.tar.gz | tar xzv && \
cd curl-7.47.1; ./configure; make; make install; cd .. && \
wget -qO- https://cran.r-project.org/src/base/R-3/R-3.4.4.tar.gz | tar xzv && \
cd R-3.4.4; ./configure --with-readline=no --with-x=no && \
make; make install;cd .. && \
cd zlib-1.2.8; pwd; make uninstall; cd ..; rm -r /packages1/zlib-1.2.8 && \
pwd; cd pcre-8.35; pwd; make uninstall; cd ..;rm -r /packages1/pcre-8.35   && \
cd xz-5.2.2; pwd; make uninstall; cd ..; rm -r /packages1/xz-5.2.2; cd curl-7.47.1; pwd; make uninstall; cd ..; rm -r /packages1/curl-7.47$
Rscript -e 'install.packages("dplyr", repos="https://cloud.r-project.org/", dependencies=TRUE)' && \
#   Rscript -e 'remove.packages("dplyr", lib=/usr/local/lib64/R/library)' && \
Rscript -e 'install.packages("xml2", repos="https://cloud.r-project.org/")' && \
#    Rscript -e 'remove.packages("xml2", lib=/usr/local/lib64/R/library)' && \
Rscript -e 'install.packages("mongolite", repos="https://cloud.r-project.org/")' && \
#    Rscript -e 'remove.packages("mongolite", lib=/usr/local/lib64/R/library)' && \
Rscript -e 'install.packages("tidyr", repos="https://cloud.r-project.org/")' && \
#    Rscript -e 'remove.packages("tidyr", lib=/usr/local/lib64/R/library))' && \
Rscript -e 'install.packages("Rcpp", repos="https://cloud.r-project.org/")' && \
#    Rscript -e 'remove.packages("Rcpp", lib=/usr/local/lib64/R/library))' && \
Rscript -e 'install.packages("RcppEigen", repos="https://cloud.r-project.org/")' && \
#    Rscript -e 'remove.packages("RcppEigen", lib=/usr/local/lib64/R/library))' && \
Rscript -e 'install.packages("rstan", repos="https://cloud.r-project.org/")' && \
#    Rscript -e 'remove.packages("rstan", lib=/usr/local/lib64/R/library))' && \
Rscript -e 'install.packages("prophet", repos="https://cloud.r-project.org/")' && \
#    Rscript -e 'remove.packages("prophet", lib=/usr/local/lib64/R/library))' && \
Rscript -e 'install.packages("rjson", repos="https://cloud.r-project.org/")'  && \
#    Rscript -e 'remove.packages("rjson", lib=/usr/local/lib64/R/library))' && \
Rscript -e 'install.packages("stringi", repos="https://cloud.r-project.org/")' && \
#    Rscript -e 'remove.packages("stringi", lib=/usr/local/lib64/R/library))' && \
Rscript -e 'install.packages("stringr", repos="https://cloud.r-project.org/")' && \
yum remove -y devtoolset-6  && \
rm -rf /var/cache/yum && \
rm -rf /usr/local/lib64/R/library
RUN rm -rf /tmp

这里有一些可能对您有帮助的想法:

最快的安装可能是 Ubuntu 18.04 作为基础以及 c4d2u PPA。这样你就可以将大多数(所有?)R 包安装为二进制文件,而不是从源代码安装它们。 IIRC 甚至有来自 rocker 项目的 Docker 图像实现了这个想法。另一种可能性是 rocker/r-ver:3.4.4,它基于 Debian。

如果必须是CentOS,你应该启用EPEL。这样 R 3.4.4 可能直接可用。但是,R 的所有构建依赖项都可以二进制文件的形式提供,包括开发包和 运行-time 包之间的拆分。如果您从源代码构建 R,您应该使用一个 RUN 块,其中

  • 安装运行时间和开发依赖项
  • 下载、配置和安装 R
  • 删除 R 源和开发包

对于包安装,我会使用一个 install.packages 和一个合适的选项 nCPU (sp?) 来启用并行处理。请注意,最后的 rm -rf /tmp/* 应该是同一 RUN 语句的一部分。

我会使用两个 RUN 语句,一个用于安装 R,一个用于安装包。这不应该增加图像大小(显着)。但是,如果您只更改软件包列表,则不必重新安装 R。