首页 > 解决方案 > R-3.4.4 的 Dockerfile,如何减少 docker build 的时间,至少需要 30 分钟

问题描述

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

Dockerfile

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

标签: rdockerdocker-image

解决方案


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

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

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

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

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

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


推荐阅读