LINUX.ORG.RU
ФорумAdmin

Размер контейнера Docker

 


0

1

Пытаюсь вывести отчёт на R через ShinyProxy, для этого отчёт нужно в Docker контейнер поместить. Полазил по форумам, почитал литературу по Docker - теорию вроде понял, а с практикой проблемы. Один из вопросов: как уменьшить размер контейнера? Как я понимаю, контейнер должен содержать в себе всё, начиная от образа ОС. По одному из примеров написал Dockerfile на основе openanalytics/r-base контейнера (https://hub.docker.com/r/openanalytics/r-base/), построил и вижу что контейнер больше гигабайта занимает места. Так каждый контейнер будет делать? Каждый отчёт, который весит пару килобайт, после упаковки в контейнер будет занимать порядка гигабайта места? Можно ли создать какой-нибудь 1 родительский контейнер, который будет содержать всё что нужно и весить много, а к нему цеплять дочерние контейнеры, содержащие только код, и занимающие пару килобайт места? Что почитать можно по этой теме?

docker commit — можно добавлять инфу в конкретный контейнер и фиксировать ее.

SR_team ★★★★★
()

А зачем отчёты хранить в контейнере ?

Samamy ★★★
()
Последнее исправление: Samamy (всего исправлений: 1)

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

Legioner ★★★★★
()

Во FreeBSD внутри Jail есть возможность использовать NullFS из основной системы. То есть изолированное окружение не будет ничего весить, кроме объёма полезного наполнения.

iZEN ★★★★★
()

По одному из примеров написал Dockerfile на основе openanalytics/r-base контейнера

приличные люди ссылки на dockerfile дают, а не на репу

Можно ли создать какой-нибудь 1 родительский контейнер, который будет содержать всё что нужно и весить много, а к нему цеплять дочерние контейнеры, содержащие только код, и занимающие пару килобайт места?

Это именно то что докер делает из коробки. Почитай про слои.

Посмотри на вывод

docker history <image> 

Он тебе покажет разбивку твоего образа по слоям и размер каждого слоя.

Ну и ещё прочитай про volumes, потому что данные в контейнере вообще-то не хранят, там внутри только движок должен быть, а данные приходят снаружи.

alpha ★★★★★
()
Ответ на: комментарий от alpha

Да уж - ящик сам-в-себе с дверцами и ключом. Вот только от нормальных контейнеров-хранителей отличается тем, что в нём, по сути, хранить ничего нельзя. :)

iZEN ★★★★★
()

А в дочерних контейнерах ты что собираешься держать? Если я тебя правильно понял, то тебе нужно пробрасывать volume на хост.

Тут есть немного интересного

PS И да, не нужно тащить образ ОС. Если говорить про питон и жаву, то там есть официальные образы, с минимальным весом, бери их.

gadzira
()
Последнее исправление: gadzira (всего исправлений: 1)
Ответ на: комментарий от gadzira

Образ с Debian или Centos весит порядка 150Mb. На нем можно не экономить.

А то сначала выберешь alpine, а потом будешь думать как туда поставить нормальную rpm-ку.

Гигабайт у ТС небось из-за некорректной работы с пакетами набегает. Если кеш пакетного менеджера не чистить, то объем и набегает.

alpha ★★★★★
()
Ответ на: комментарий от iZEN

В кои веки, я подержу ваш подкол. :)

anc ★★★★★
()

До меня только сегодня дошло что можно не создавать отдельный контейнер под каждый отчёт, а хранить все отчёты в одном контейнере alpha мой Dockerfile:

# Родительский контейнерю содержит образ: Ubuntu 16.04 LTS with a basic R installation
# https://hub.docker.com/r/openanalytics/r-base/
FROM openanalytics/r-base


# Обратная связь
MAINTAINER ххх


# Основные системные библиотеки
RUN apt-get update && apt-get install -y \
    sudo \
    curl \
    pandoc \
    pandoc-citeproc \
    libcurl4-gnutls-dev \
    libcairo2-dev \
    libxt-dev \
    libssl-dev \
    libssh2-1-dev \
    libssl1.0.0
    
# Библиотеки для R
RUN apt-get update && apt-get install -y \
    unixodbc \
    unixodbc-dev
 
 
# Нужно отдельно настроить драйвер ODBC для MS SQL. Подробное описание что и зачем есть у меня в OneNote
# Пример: https://github.com/Microsoft/mssql-docker/blob/master/linux/mssql-tools/Dockerfile
# adding custom MS repository
RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
RUN curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list > /etc/apt/sources.list.d/mssql-release.list
RUN apt-get update && ACCEPT_EULA=Y apt-get install -y msodbcsql 
RUN echo "[SQL Server]\nDescription=Microsoft ODBC Driver 13 for SQL Server\nDriver=/opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.1.so.9.2\nUsageCount=1\n" >> /etc/odbcinst.ini
    
    
# Установка пакетов R
RUN R -e "install.packages(c('rmarkdown', 'shiny', 'shinydashboard', 'DT', 'RODBC', 'digest'), repos='https://cloud.r-project.org/', dependencies = TRUE)"
RUN R -e "install.packages(c('ggplot2', 'labeling', 'leaflet', 'RColorBrewer', 'dplyr'), repos='https://cloud.r-project.org/', dependencies = TRUE)"


# Копируем общие файлы R
RUN mkdir -p /usr/local/include/R
COPY include /usr/local/include/R


# Помещаем отчёты из временной директории в отдельную директорию. Shiny без этого не работает
RUN mkdir /root/DWHDashboard
RUN mkdir /root/GetUser
COPY DWHDashboard /root/DWHDashboard
COPY GetUser /root/GetUser


# Для того чтобы Shiny увидел приложение нужно выполнить 2 команды ниже
COPY Rprofile.site /usr/lib/R/etc/
EXPOSE 3838

Посмотрел я вывод команды docker history, вроде понял. Больше всего места занимают слои с apt-get update и apt-get install

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

Вопрос решился, всем спасибо за ответы

powerlord
() автор топика
Ответ на: комментарий от powerlord

Вместо

RUN apt-get update
RUN apt-get install package1
RUN apt-get install package2
RUN apt-cache clean all

Надо делать

RUN apt-get update \
     && apt-get install package1 \
     && apt-cache clean all

RUN apt-get update \
     && apt-get install package2 \
     && apt-cache clean all

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

alpha ★★★★★
()

Просто надо юзать NixOS.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.