Как "скопировать" установленные R-пакеты с этапа 1 на 2 этап, используя многоступенчатую сборку на образе R-base?

Я пытаюсь построить базу образа на основе R, следуя многоступенчатому методу. Как я могу скопировать установленные пакеты со стадии 1ste на стадию 2? И ничего больше?

Текущий файл дает мне базовую версию R без пакетов. Таким образом, пакеты, установленные на этапе 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

1 ответ

Решение

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

Наконец, вы можете использовать многоступенчатую сборку из трех этапов:

  1. Добавьте зависимости времени выполнения.
  2. Добавьте зависимости времени сборки и установите пакеты в /usr/local/lib/R/site-library.
  3. Используйте 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

Я лично использовал первый и второй подход. Третий подход я не тестировал, надеюсь, он тоже сработает.

Другие вопросы по тегам