Docker 我如何';复印件';使用R-base映像上的多级构建从第一阶段安装到第二阶段的R-packages?
我尝试在R-base上建立一个图像库,遵循多阶段方法。如何将已安装的软件包从1ste阶段复制到第二阶段?没有别的了吗 当前文件基本上为我提供了一个“无包”的R-base版本。因此,安装在1ste阶段的软件包在某处“丢失” 我认为这与制作和选择正确的目录有关。这对我来说是一个令人困惑的部分,因为我是一个相当新的对接应用程序 谢谢你的帮助 在我的当前文件下面:Docker 我如何';复印件';使用R-base映像上的多级构建从第一阶段安装到第二阶段的R-packages?,docker,build,dockerfile,r-package,multistage,Docker,Build,Dockerfile,R Package,Multistage,我尝试在R-base上建立一个图像库,遵循多阶段方法。如何将已安装的软件包从1ste阶段复制到第二阶段?没有别的了吗 当前文件基本上为我提供了一个“无包”的R-base版本。因此,安装在1ste阶段的软件包在某处“丢失” 我认为这与制作和选择正确的目录有关。这对我来说是一个令人困惑的部分,因为我是一个相当新的对接应用程序 谢谢你的帮助 在我的当前文件下面: # Base image FROM rocker/r-base:latest AS stage1 ## install binary, b
# 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
#基本图像
从摇臂/r底座:最新版本为stage1
##安装二进制软件包、内部版本软件包和相关软件包
运行apt-get-update&&apt-get-install-y-qq——无安装建议——清除\
r-cran-PDF工具\
r-cran-dplyr\
r型起重机纵梁\
libxml2开发\
libssl开发与维护\
回音“r在评论中,你注意到你想要摆脱任何多余的‘重量’。后者通常来自于安装了开发工具和软件包。现在,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
# 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
第二,您可以在从源代码安装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
中
使用1。作为基础,从2添加包
比如说:
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
# 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
我个人使用了第一种和第二种方法。我还没有测试第三种方法,因为我希望它也能起作用。你的目标是什么?安装的软件包还需要安装所有运行时依赖项(R软件包和系统库)。您唯一可以摆脱的是构建时依赖项,通常是系统依赖项的开发包。@RalfStubner thnx供您回答。我的目标是让这张图片“制作就绪”,并摆脱任何多余的“重量”。所以我需要构建包,但我不需要在映像中运行应用程序。所以您已经回答过了:我想去掉构建时依赖项(如果不需要它们来正确运行应用程序的话)。希望这能回答你的问题。非常感谢你的回答。所有的方法都对我有效。您的第三个Dockerfile多级示例正是我想要的答案。它很好地展示了如何在安装了各种软件包的情况下限制lean R Base Docker的图像大小。