Как «скопировать» установленные R-пакеты с 1-го этапа на 2-й этап, используя многоэтапное построение на R-base образе? - PullRequest
0 голосов
/ 28 октября 2019

Я пытаюсь построить базу изображений на основе R, используя многоэтапный метод. Как я могу скопировать установленные пакеты из 1-го этапа во 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 Ответ

0 голосов
/ 29 октября 2019

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...