我如何 'copy' 在 R-base 映像上使用多阶段构建从第 1 阶段到第 2 阶段安装 R 包?
How do I 'copy' installed R-packages from the 1ste stage to 2nd stage using multistage building on a R-base image?
我正在尝试按照多阶段方法在 R-base 上构建图像。如何将安装的软件包从第一阶段复制到第二阶段?没有别的吗?
当前文件基本上是 'packageless' R-base 版本。所以第一阶段安装的包在'lost'某处。
我认为这与制作和选择正确的目录有关。这对我来说是一个令人困惑的部分,因为我对 dockerizing 应用程序还很陌生。
感谢您的帮助!
在我当前的文件下面:
# 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
在评论中您注意到您想要摆脱任何多余的东西 'weight'。后者通常来自安装开发工具和包。现在 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
最后,您可以使用包含三个阶段的多阶段构建:
- 添加 运行-time 依赖项。
- 添加构建时依赖项并将包安装到
/usr/local/lib/R/site-library
。
- 使用 1. 作为基础并添加来自 2.
的包
所以像这样:
# 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-base 上构建图像。如何将安装的软件包从第一阶段复制到第二阶段?没有别的吗?
当前文件基本上是 'packageless' R-base 版本。所以第一阶段安装的包在'lost'某处。
我认为这与制作和选择正确的目录有关。这对我来说是一个令人困惑的部分,因为我对 dockerizing 应用程序还很陌生。
感谢您的帮助!
在我当前的文件下面:
# 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
在评论中您注意到您想要摆脱任何多余的东西 'weight'。后者通常来自安装开发工具和包。现在 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
最后,您可以使用包含三个阶段的多阶段构建:
- 添加 运行-time 依赖项。
- 添加构建时依赖项并将包安装到
/usr/local/lib/R/site-library
。 - 使用 1. 作为基础并添加来自 2. 的包
所以像这样:
# 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
第一种和第二种方法我个人都用过。我还没有测试第三种方法,我希望它也能工作。