使用R/python依赖项优化Docker
我最初在Docker论坛上发布了这个问题,但还没有收到任何评论,所以我将其发布在这里,因为so的流量要大得多 在一句话中,我正试图精简我的R/python docker,欢迎任何建议!谢谢大家!使用R/python依赖项优化Docker,r,docker,R,Docker,我最初在Docker论坛上发布了这个问题,但还没有收到任何评论,所以我将其发布在这里,因为so的流量要大得多 在一句话中,我正试图精简我的R/python docker,欢迎任何建议!谢谢大家! 因此,我正在为一些具有docker依赖关系的应用程序构建docker映像,但我编写的简单构建过程(请参见下面的Dockerfile,第1阶段)导致映像大小膨胀 因此,我正在考虑使用多阶段构建,阅读缩小图像大小是多么棒 显然,简单地从构建层复制R&Rscript二进制文件和包是行不通的,因为我确实收到
因此,我正在为一些具有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
所以我的问题是,
- 我的方法是否存在根本性缺陷(或者考虑到节省空间/维护的权衡,根本不值得这么做),或者
- 我只是需要复制更多的库吗
带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/*”