在评论中,您注意到您想摆脱任何多余的“重量”。后者通常来自安装了开发工具和软件包。现在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
.
- 使用 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
我个人使用过第一种和第二种方法。我还没有测试过第三种方法,我希望它也能工作。