我正在尝试按照多阶段方法在R-base上构建图像。如何将已安装的软件包从1ste阶段复制到2nd阶段?还有别的吗?
当前文件基本上给了我一个“无包装”的基于R的版本。因此,在1ste阶段安装的软件包会“丢失”在某个地方。
我认为这与制作和选择正确的目录有关。这对我来说是一个令人困惑的部分,因为我对Docker化应用程序还很陌生。
感谢您的所有帮助!
在我当前的文件下面:
# Base image
FROM rocker/r-base:latest AS stage1
## install binary, build and dependend packages
RUN apt-get update && apt-get install -y -qq --no-install-recommends --purge \
r-cran-pdftools \
r-cran-dplyr \
r-cran-stringr \
libxml2-dev \
libssl-dev && \
echo "r <- getOption('repos');r['CRAN'] <- 'http://cran.us.r-project.org'; options(repos = r);" > ~/.Rprofile && \
Rscript -e "install.packages(c('AzureStor'))"
##2nd stage, pulling 'fresh' base image
FROM rocker/r-base:latest
#COPY packages from 1st stage
COPY --from=stage1 /usr/local/lib/R/site-library /usr/local/lib/R/site-library
## create directories
RUN mkdir -p /script \
#Copy scripts
COPY /script /script
## Set workdir
WORKDIR /script
答案 0 :(得分:0)
在注释中,您指出您想摆脱任何多余的“重量”。后者通常来自于安装开发工具和软件包。现在,rocker/r-base
映像已经具有相当大的分量,因为它安装了r-base-devel
及其相关性。但是,我们可以通过摆脱构建时的依赖关系,而在最终映像中仅保留运行时的依赖关系,以尝试不增加更多的权重。 R程序包在运行时不需要的构建时依赖关系通常是开发文件,例如系统库的头文件,例如您在运行时不需要libxml2-dev
软件包。 libxml2
包就足够了。
我看到了几种可能的方法。
首先,对于那些需要针对系统库进行编译的软件包,可以使用二进制软件包。我没有检查AzureStor
的依赖关系,但是很可能所有必需的R软件包都以已编译的Debian软件包形式存在。这些将仅取决于运行时相关性,从而使映像大小较小且构建时间较短。您的Dockerfile
看起来像这样:
FROM rocker/r-base:latest
## install binary, build and dependend packages
RUN apt-get update && apt-get install -y -qq --no-install-recommends --purge \
r-cran-pdftools \
r-cran-dplyr \
r-cran-stringr \
r-cran-... \
r-cran-... && \
Rscript -e "install.packages(c('AzureStor'))" && \
apt-get clean %% \
rm -rf /var/lib/apt/lists/* && \
rm -rf /tmp/*
## create directories
RUN mkdir -p /script
#Copy scripts
COPY /script /script
## Set workdir
WORKDIR /script
第二,您可以在从源安装R软件包之前安装构建时和运行时依赖项,并在其后删除构建时依赖项,所有这些都可以在一个命令中完成:
FROM rocker/r-base:latest
## install binary, build and dependend packages
RUN apt-get update && apt-get install -y -qq --no-install-recommends --purge \
r-cran-pdftools \
r-cran-dplyr \
r-cran-stringr \
libxml2-dev libxml2 \
libssl-dev libssl1.1 && \
Rscript -e "install.packages(c('AzureStor'))" && \
apt-get purge --yes libxml2-dev libssl-dev && \
apt-get clean %% \
rm -rf /var/lib/apt/lists/* && \
rm -rf /tmp/*
## create directories
RUN mkdir -p /script
#Copy scripts
COPY /script /script
## Set workdir
WORKDIR /script
最后,您可以使用具有三个阶段的多阶段构建:
/usr/local/lib/R/site-library
中。是这样的:
# Base image
FROM rocker/r-base:latest AS stage1
## install binary, build and dependend packages
RUN apt-get update && apt-get install -y -qq --no-install-recommends --purge \
r-cran-pdftools \
r-cran-dplyr \
r-cran-stringr \
libxml2 \
libssl1.1 && \
apt-get clean %% \
rm -rf /var/lib/apt/lists/* && \
rm -rf /tmp/*
FROM stage1 AS stage2
RUN apt-get update && apt-get install -y -qq --no-install-recommends --purge \
libxml2-dev \
libssl-dev && \
Rscript -e "install.packages(c('AzureStor'))"
FROM stage1
COPY --from=stage2 /usr/local/lib/R/site-library /usr/local/lib/R/site-library
## create directories
RUN mkdir -p /script \
#Copy scripts
COPY /script /script
## Set workdir
WORKDIR /script
我亲自使用了第一种和第二种方法。我尚未测试第三种方法,因为我希望它也能正常工作。