使用R/python依赖项优化Docker

使用R/python依赖项优化Docker,r,docker,R,Docker,我最初在Docker论坛上发布了这个问题,但还没有收到任何评论,所以我将其发布在这里,因为so的流量要大得多 在一句话中,我正试图精简我的R/python docker,欢迎任何建议!谢谢大家! 因此,我正在为一些具有docker依赖关系的应用程序构建docker映像,但我编写的简单构建过程(请参见下面的Dockerfile,第1阶段)导致映像大小膨胀 因此,我正在考虑使用多阶段构建,阅读缩小图像大小是多么棒 显然,简单地从构建层复制R&Rscript二进制文件和包是行不通的,因为我确实收到

我最初在Docker论坛上发布了这个问题,但还没有收到任何评论,所以我将其发布在这里,因为so的流量要大得多

在一句话中,我正试图精简我的R/python docker,欢迎任何建议!谢谢大家!


因此,我正在为一些具有docker依赖关系的应用程序构建docker映像,但我编写的简单构建过程(请参见下面的Dockerfile,第1阶段)导致映像大小膨胀

因此,我正在考虑使用多阶段构建,阅读缩小图像大小是多么棒

显然,简单地从构建层复制R&
Rscript
二进制文件和包是行不通的,因为我确实收到了以下错误消息,表明我还需要复制那些动态libs依赖项

/usr/lib/R/bin/R: line 238: /usr/lib/R/etc/ldpaths: No such file or directory
/usr/lib/R/bin/exec/R: error while loading shared libraries: libR.so: cannot open shared object file: No such file or directory
所以我的问题是,

  • 我的方法是否存在根本性缺陷(或者考虑到节省空间/维护的权衡,根本不值得这么做),或者
  • 我只是需要复制更多的库吗
还有一个与远程相关的问题:Python依赖项是否也会出现类似的情况

谢谢


带R的插图

####### stage 1: build
FROM ubuntu:18.10 as builder

# update OS libs
ARG OS_LIBS="software-properties-common libcurl4-openssl-dev libssl-dev libxml2-dev gpg-agent gnupg"
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get -qqy update --fix-missing && \
    apt-get -qqy full-upgrade && \
    apt-get -qqy install --no-install-recommends \
        ${OS_LIBS} && \
    apt-get autoremove --purge -y && apt-get autoclean -y && \
    rm -rf /var/cache/apt/* /var/lib/apt/lists/* /var/tmp/* /tmp/* /usr/share/man/?? /usr/share/man/??_*

# install base R
ARG R_RELEASE_VERSION="3.5.1"
RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E084DAB9 && \
    add-apt-repository "deb http://cran.rstudio.com/bin/linux/ubuntu cosmic-cran35/" && \
    apt-get -qqy update --fix-missing && \
    apt-get -qqy full-upgrade && \
    apt-get -qqy install --no-install-recommends \
        r-base-core="${R_RELEASE_VERSION}"-1build1 \
        r-base-dev="${R_RELEASE_VERSION}"-1build1
# this is just a toy example
RUN R -e -vanilla 'install.packages("data.table", destdir = "/tmp/R_pkg_download/", clean = TRUE)'



####### stage 2: copy the binary and libs
FROM ubuntu:18.10

RUN mkdir -p /usr/lib/R \
             /usr/local/lib/R/site-library
COPY --from=builder /usr/bin/R /usr/bin/R
COPY --from=builder /usr/bin/Rscript /usr/bin/Rscript
COPY --from=builder /usr/lib/R /usr/lib/R
COPY --from=builder /usr/local/lib/R/site-library /usr/local/lib/R/site-library


是的,您还需要复制共享库(例如前面提到的
libR.so
),因为动态链接的libR二进制文件需要这些库


但是这种图像大小优化不值得,除非您有特定的用例。节省的磁盘空间的价格可能远低于您将用于此优化的时间价值。我将使用
rocker
rocker/R-ver
)中的一些现成的R映像,用于一般R用途。

是的,您还需要复制共享库(例如提到的
libR.so
),因为动态链接的R二进制文件需要它们


但是这种图像大小优化不值得,除非您有特定的用例。节省的磁盘空间的价格可能远低于您将用于此优化的时间价值。我将使用
rocker
rocker/R-ver
)中一些现成的R图像作为您的案例证明R图像,供一般R使用。

因此,在@Jan Garaj的回答(公认的答案,因为它总结得很好)的提示下,我深入挖掘,看看是否能找到一些数据来支持这一主张

使用下面的Dockerfile构建一个映像,我们可以看到目录大小的输出,如下表所示。 结论是,正如@Jan Garaj所指出的,当涉及到缩小图像尺寸时,最初的优化想法是不值得的


Dockerfile请注意,这不会开箱即用,因为我没有包含R包安装脚本,但编写起来很简单

FROM ubuntu:18.10

ARG DEBIAN_FRONTEND=noninteractive

RUN du -sh --exclude=/proc /* 
RUN du -sh /usr/* && \
    du -sh /usr/lib/* && \
    du -sh /usr/local/*

ARG R_DEP_TRANSIENT="make gpg-agent gnupg"
ARG R_DEPENDENCIES="software-properties-common libcurl4-openssl-dev libssl-dev libxml2-dev ${R_DEP_TRANSIENT} g++"
RUN apt-get -qqy update --fix-missing && \
    apt-get -qqy full-upgrade && \
    apt-get -qqy install --no-install-recommends \
                 ${R_DEPENDENCIES} && \
    rm -rf /var/cache/apt/* /var/lib/apt/lists/* /var/tmp/* /tmp/* /usr/share/man/?? /usr/share/man/??_* && \
    du -sh --exclude=/proc /* 
RUN du -sh /usr/* && \
    du -sh /usr/lib/* && \
    du -sh /usr/local/* && \
    du -sh /usr/local/lib/*

ARG R_RELEASE_VERSION="3.5.1"
ARG SLIM_R_LIB_CMD="find .  -type d \\( -name \"help\" -o -name \"doc\" -o -name \"html\" -o -name \"htmlwidgets\" -o -name \"demo\" -o -name \"demodata\" -o -name \"examples\" -o -name \"exampleData\" -o -name \"unitTests\" -o -name \"tests\" -o -name \"testdata\" -o -name \"shiny\" \\) | xargs rm -rf"
ADD install_R_packages.R .
RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E084DAB9 && \
    add-apt-repository "deb http://cran.rstudio.com/bin/linux/ubuntu cosmic-cran35/" && \
    apt-get -qqy update --fix-missing && \
    apt-get -qqy full-upgrade && \
    apt-get -qqy install --no-install-recommends \
                 r-base-core="${R_RELEASE_VERSION}"-1build1 \
                 r-base-dev="${R_RELEASE_VERSION}"-1build1 && \
    mkdir -p /tmp/R_pkg_download/ && \
    Rscript install_R_packages.R && \
    cd "/usr/local/lib/R/site-library" && eval ${SLIM_R_LIB_CMD} && \
    cd "/usr/lib/R/site-library" && eval ${SLIM_R_LIB_CMD} && \
    apt-get -qqy purge \
                 ${R_DEP_TRANSIENT} && \
    apt-get -qqy autoremove --purge && apt-get -qqy autoclean && \
    rm -rf install_R_packages.R /tmp/R_pkg_download/ /var/cache/apt/* /var/lib/apt/lists/* /var/tmp/* /tmp/* /usr/share/man/?? /usr/share/man/??_* && \
    du -sh --exclude=/proc /* 
RUN du -sh /usr/* && \
    du -sh /usr/lib/* && \
    du -sh /usr/local/* && \
    du -sh /usr/local/lib/*


表格

概述

“usr/lib/*”

“usr/local/*”

“usr/local/lib/*”


因此,在@Jan Garaj的回答(被接受的答案,因为它总结得很好)的提示下,我深入挖掘,看看是否能找到一些数据来支持这一说法

使用下面的Dockerfile构建一个映像,我们可以看到目录大小的输出,如下表所示。 结论是,正如@Jan Garaj所指出的,当涉及到缩小图像尺寸时,最初的优化想法是不值得的


Dockerfile请注意,这不会开箱即用,因为我没有包含R包安装脚本,但编写起来很简单

FROM ubuntu:18.10

ARG DEBIAN_FRONTEND=noninteractive

RUN du -sh --exclude=/proc /* 
RUN du -sh /usr/* && \
    du -sh /usr/lib/* && \
    du -sh /usr/local/*

ARG R_DEP_TRANSIENT="make gpg-agent gnupg"
ARG R_DEPENDENCIES="software-properties-common libcurl4-openssl-dev libssl-dev libxml2-dev ${R_DEP_TRANSIENT} g++"
RUN apt-get -qqy update --fix-missing && \
    apt-get -qqy full-upgrade && \
    apt-get -qqy install --no-install-recommends \
                 ${R_DEPENDENCIES} && \
    rm -rf /var/cache/apt/* /var/lib/apt/lists/* /var/tmp/* /tmp/* /usr/share/man/?? /usr/share/man/??_* && \
    du -sh --exclude=/proc /* 
RUN du -sh /usr/* && \
    du -sh /usr/lib/* && \
    du -sh /usr/local/* && \
    du -sh /usr/local/lib/*

ARG R_RELEASE_VERSION="3.5.1"
ARG SLIM_R_LIB_CMD="find .  -type d \\( -name \"help\" -o -name \"doc\" -o -name \"html\" -o -name \"htmlwidgets\" -o -name \"demo\" -o -name \"demodata\" -o -name \"examples\" -o -name \"exampleData\" -o -name \"unitTests\" -o -name \"tests\" -o -name \"testdata\" -o -name \"shiny\" \\) | xargs rm -rf"
ADD install_R_packages.R .
RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E084DAB9 && \
    add-apt-repository "deb http://cran.rstudio.com/bin/linux/ubuntu cosmic-cran35/" && \
    apt-get -qqy update --fix-missing && \
    apt-get -qqy full-upgrade && \
    apt-get -qqy install --no-install-recommends \
                 r-base-core="${R_RELEASE_VERSION}"-1build1 \
                 r-base-dev="${R_RELEASE_VERSION}"-1build1 && \
    mkdir -p /tmp/R_pkg_download/ && \
    Rscript install_R_packages.R && \
    cd "/usr/local/lib/R/site-library" && eval ${SLIM_R_LIB_CMD} && \
    cd "/usr/lib/R/site-library" && eval ${SLIM_R_LIB_CMD} && \
    apt-get -qqy purge \
                 ${R_DEP_TRANSIENT} && \
    apt-get -qqy autoremove --purge && apt-get -qqy autoclean && \
    rm -rf install_R_packages.R /tmp/R_pkg_download/ /var/cache/apt/* /var/lib/apt/lists/* /var/tmp/* /tmp/* /usr/share/man/?? /usr/share/man/??_* && \
    du -sh --exclude=/proc /* 
RUN du -sh /usr/* && \
    du -sh /usr/lib/* && \
    du -sh /usr/local/* && \
    du -sh /usr/local/lib/*


表格

概述

“usr/lib/*”

“usr/local/*”

“usr/local/lib/*”