Оптимизация Docker с зависимостями R / python - PullRequest
0 голосов
/ 06 февраля 2019

Я первоначально разместил вопрос на форуме Docker, но еще не получил ни одного комментария, поэтому размещаю его здесь, поскольку на SO гораздо больше трафика.

https://forums.docker.com/t/using-multi-stage-docker-build-for-slimming-down-images-with-r-dependency/67967

Водним предложением, я пытаюсь уменьшить мой док R / python, любые предложения приветствуются!Спасибо!


Итак, я создаю образы докеров для некоторых приложений, которые имеют R-зависимости, но наивный процесс сборки, который я написал (см. Ниже для Dockerfile, этап 1), приводит к IMO, завышенный размер изображения.

Поэтому я подумываю об использовании многоэтапной сборки, читая о том, как это здорово для уменьшения размера изображения.

Очевидно, просто копируя R & Rscript бинарный и пакеты из уровня сборки не будут работать, так как я получил следующее сообщение об ошибке, указывающее, что мне также нужно скопировать эти динамические зависимости libs.

/usr/lib/R/bin/R: line 238: /usr/lib/R/etc/ldpaths: No such file or directory
/usr/lib/R/bin/exec/R: error while loading shared libraries: libR.so: cannot open shared object file: No such file or directory

Так что мой вопрос,

  • мой подход в корне ошибочен (или вообще не стоит того, чтобы сэкономить место на обслуживании / обслуживании), или
  • мне просто нужно скопировать еще несколько библиотек?

И проблема, связанная с удаленно: будет ли подобный сценарий и для зависимостей Python?

Спасибо!


Иллюстрация с R

####### stage 1: build
FROM ubuntu:18.10 as builder

# update OS libs
ARG OS_LIBS="software-properties-common libcurl4-openssl-dev libssl-dev libxml2-dev gpg-agent gnupg"
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get -qqy update --fix-missing && \
    apt-get -qqy full-upgrade && \
    apt-get -qqy install --no-install-recommends \
        ${OS_LIBS} && \
    apt-get autoremove --purge -y && apt-get autoclean -y && \
    rm -rf /var/cache/apt/* /var/lib/apt/lists/* /var/tmp/* /tmp/* /usr/share/man/?? /usr/share/man/??_*

# install base R
ARG R_RELEASE_VERSION="3.5.1"
RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E084DAB9 && \
    add-apt-repository "deb http://cran.rstudio.com/bin/linux/ubuntu cosmic-cran35/" && \
    apt-get -qqy update --fix-missing && \
    apt-get -qqy full-upgrade && \
    apt-get -qqy install --no-install-recommends \
        r-base-core="${R_RELEASE_VERSION}"-1build1 \
        r-base-dev="${R_RELEASE_VERSION}"-1build1
# this is just a toy example
RUN R -e -vanilla 'install.packages("data.table", destdir = "/tmp/R_pkg_download/", clean = TRUE)'



####### stage 2: copy the binary and libs
FROM ubuntu:18.10

RUN mkdir -p /usr/lib/R \
             /usr/local/lib/R/site-library
COPY --from=builder /usr/bin/R /usr/bin/R
COPY --from=builder /usr/bin/Rscript /usr/bin/Rscript
COPY --from=builder /usr/lib/R /usr/lib/R
COPY --from=builder /usr/local/lib/R/site-library /usr/local/lib/R/site-library

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Итак, в ответ на ответ @Jan Garaj (принятый ответ, потому что он хорошо обобщен), я пошел копать глубже и посмотреть, могу ли я найти какие-то данные, подтверждающие утверждение.

Построениеimage со следующим Dockerfile, мы видим вывод размеров каталогов, приведенных ниже в виде таблиц.Вывод таков, как указал @Jan Garaj, оригинальная идея оптимизации не стоит того, чтобы уменьшить размер изображения.


Dockerfile обратите внимание, что этоне выйдет из коробки, так как я не включаю сценарий установки пакета R, но написать его тривиально.

FROM ubuntu:18.10

ARG DEBIAN_FRONTEND=noninteractive

RUN du -sh --exclude=/proc /* 
RUN du -sh /usr/* && \
    du -sh /usr/lib/* && \
    du -sh /usr/local/*

ARG R_DEP_TRANSIENT="make gpg-agent gnupg"
ARG R_DEPENDENCIES="software-properties-common libcurl4-openssl-dev libssl-dev libxml2-dev ${R_DEP_TRANSIENT} g++"
RUN apt-get -qqy update --fix-missing && \
    apt-get -qqy full-upgrade && \
    apt-get -qqy install --no-install-recommends \
                 ${R_DEPENDENCIES} && \
    rm -rf /var/cache/apt/* /var/lib/apt/lists/* /var/tmp/* /tmp/* /usr/share/man/?? /usr/share/man/??_* && \
    du -sh --exclude=/proc /* 
RUN du -sh /usr/* && \
    du -sh /usr/lib/* && \
    du -sh /usr/local/* && \
    du -sh /usr/local/lib/*

ARG R_RELEASE_VERSION="3.5.1"
ARG SLIM_R_LIB_CMD="find .  -type d \\( -name \"help\" -o -name \"doc\" -o -name \"html\" -o -name \"htmlwidgets\" -o -name \"demo\" -o -name \"demodata\" -o -name \"examples\" -o -name \"exampleData\" -o -name \"unitTests\" -o -name \"tests\" -o -name \"testdata\" -o -name \"shiny\" \\) | xargs rm -rf"
ADD install_R_packages.R .
RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E084DAB9 && \
    add-apt-repository "deb http://cran.rstudio.com/bin/linux/ubuntu cosmic-cran35/" && \
    apt-get -qqy update --fix-missing && \
    apt-get -qqy full-upgrade && \
    apt-get -qqy install --no-install-recommends \
                 r-base-core="${R_RELEASE_VERSION}"-1build1 \
                 r-base-dev="${R_RELEASE_VERSION}"-1build1 && \
    mkdir -p /tmp/R_pkg_download/ && \
    Rscript install_R_packages.R && \
    cd "/usr/local/lib/R/site-library" && eval ${SLIM_R_LIB_CMD} && \
    cd "/usr/lib/R/site-library" && eval ${SLIM_R_LIB_CMD} && \
    apt-get -qqy purge \
                 ${R_DEP_TRANSIENT} && \
    apt-get -qqy autoremove --purge && apt-get -qqy autoclean && \
    rm -rf install_R_packages.R /tmp/R_pkg_download/ /var/cache/apt/* /var/lib/apt/lists/* /var/tmp/* /tmp/* /usr/share/man/?? /usr/share/man/??_* && \
    du -sh --exclude=/proc /* 
RUN du -sh /usr/* && \
    du -sh /usr/lib/* && \
    du -sh /usr/local/* && \
    du -sh /usr/local/lib/*


Таблицы

Общая информация

general

"usr / lib / *"

"usr / local / *"

"usr / local / lib / *"

0 голосов
/ 06 февраля 2019

Да, вам также необходимо скопировать общие библиотеки (например, упомянутые libR.so), поскольку они требуются для динамически связанных двоичных файлов R.

Но такая оптимизация размера изображения не стоит, если только выесть конкретный вариант использования.Цена сэкономленного дискового пространства, вероятно, намного ниже стоимости времени, которое вы потратите на эту оптимизацию.Я буду использовать готовое R-изображение из rocker (rocker/r-ver) в вашем случае - проверенные R-изображения для общего использования R.

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