В комментариях вы отмечаете, что хотите избавиться от лишнего «веса». Последнее обычно происходит из-за наличия инструментов разработки и пакетов. Теперь образ 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
Я лично использовал первый и второй подход. Я не проверял третий подход, я ожидаю, что он также будет работать.