Docker 我如何';复印件';使用R-base映像上的多级构建从第一阶段安装到第二阶段的R-packages?

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

我尝试在R-base上建立一个图像库,遵循多阶段方法。如何将已安装的软件包从1ste阶段复制到第二阶段?没有别的了吗

当前文件基本上为我提供了一个“无包”的R-base版本。因此,安装在1ste阶段的软件包在某处“丢失”

我认为这与制作和选择正确的目录有关。这对我来说是一个令人困惑的部分,因为我是一个相当新的对接应用程序

谢谢你的帮助

在我的当前文件下面:

# 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的图像大小。