LINUX.ORG.RU

большой образ Docker

 


0

4

При создании Docker образа приходится тянуть 8GB пакетов с хост системы.

Методом COPY, потом удалять. Но вывод docker images показывает размер контейнера с учетом скопированных в слое ранее пакетов. И при каждом следующем релизе образ растет все больше.

Какой механизм можно использовать для доставки пакетов на время генерации образа?

Заменить на контейнер, например.

Radjah ★★★★★ ()

забиндить в контейнер директорию хоста, где лежит все нужное; ты вообще документацию хоть пытался открывать? это, наверно, первый или второй вопрос в каком-нибудь факе
/thread

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

Серьезно? Все так просто?

А я то думал, что VOLUME подключается при run контейнера, из образа.

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

ну, я думал, что стартует минимальный образ, куда надо потом доставить туеву хучу пакетов, это не так?

anonymous ()

Удалить промежуточные слои во время сборки, не?

docker build --force-rm

Deleted ()
Ответ на: комментарий от anonymous

Ой стыдно показывать но я в отчаянье... Сборка «gold» образа.

FROM centos

COPY repo /tmp/repo
COPY conf-file /tmp/conf-file
COPY conf-file/supervisord.conf /etc/supervisord.d/supervisord.ini


RUN useradd mqm && echo 'mqm:mqm' | chpasswd
RUN yum install epel-release -y && yum install nano supervisor openssh-server glibc.i686 libgcc_s.so.1 syslog-ng net-tools --setopt=protected_multilib=false -y    # Устанавливаем пакеты
RUN sed -i -E 's/^(\s*)system\(\);/\1unix-stream("\/dev\/log");/' /etc/syslog-ng/syslog-ng.conf
RUN echo 'root:root' | chpasswd && ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key                                                               
RUN cd /tmp/repo && chmod -R 777 ./* && ./mqlicense.sh -accept && yum install ./MQ* -y                          # Установка 

и тд...
                                                                              

После наступает релиз.

FROM gold


COPY BarDir /release
COPY config-file /release/config
COPY config-file/odbc.ini /opt/share/odbc.ini

RUN chmod +x /release/config/InstallBar.sh



RUN su -s /bin/bash mqm -c '. /opt/ibm/mqsi/9.0.0.6/bin/mqsiprofile && strmqm ESB.BRK01_QM && runmqsc ESB.BRK01_QM < /release/config/queues.txt'

#RUN su -s /bin/bash mqm -c 'cd /release && . /opt/ibm/mqsi/9.0.0.6/bin/mqsiprofile && export ODBCSYSINI=/var/mqsi/odbc && export BROKER_NAME=ESB.BRK01 && strmqm ESB.BRK01_QM && mqsistart ESB.BRK01 && /release/config/InstallBar.sh'

#RUN rm -rf /release/*

EXPOSE 22 7800 7800 7803 7842 7804 7805 7807 7808 7809 7810 7811 1414

CMD ["/usr/bin/supervisord"]

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

Зачем его узнавать? Промежуточные слои сами удалятся после сборки.

Deleted ()
Ответ на: комментарий от ilovemoney
RUN cd /tmp/repo && chmod -R 777 ./* && ./mqlicense.sh -accept && yum install ./MQ* -y; rm -rf /tmp/repo

не?

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

не, ибо COPY происходит слоем выше, и при удалении с образа никуда не девается.

ilovemoney ()
Ответ на: комментарий от Deleted

чо то не работает=(

docker build --force-rm -t dev2 /home/gold/ docker build --force-rm=true -t dev2 /home/gold/

 docker history dev2
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
c09cac2794df        39 seconds ago      /bin/sh -c rm -rf /tmp/repo                     0 B
4b4e46cbe222        46 seconds ago      /bin/sh -c mkdir -p /opt/ibm/iib/ODBC/V7.0/ &   29.12 MB
02e1351fd22b        53 seconds ago      /bin/sh -c su -s /bin/bash mqm -c '. /opt/ibm   21.1 MB
52d88fc9732f        3 minutes ago       /bin/sh -c su -s /bin/bash mqm -c '. /opt/ibm   18.71 MB
a0460a972997        3 minutes ago       /bin/sh -c su -s /bin/bash mqm -c '. /opt/ibm   17.65 MB
adfc53fd726a        3 minutes ago       /bin/sh -c su -s /bin/bash mqm -c '. /opt/ibm   17.48 MB
d2946fe07ed5        3 minutes ago       /bin/sh -c su -s /bin/bash mqm -c '. /opt/ibm   168.5 MB
687c188e2734        3 minutes ago       /bin/sh -c echo '. /opt/ibm/mqsi/9.0.0.6/bin/   367 B
fb6267758c37        3 minutes ago       /bin/sh -c mkdir -p /opt/share/data && mkdir    482.9 kB
bacd7f4f34e4        4 minutes ago       /bin/sh -c cd /tmp/repo/esb9.0.6 && ./setupli   1.035 GB
a4fe24c1575f        5 minutes ago       /bin/sh -c cd /tmp/repo/esb9.0.0 && cd /opt/m   998.9 MB
939c2c8672a5        6 minutes ago       /bin/sh -c cd /tmp/repo/IEDir && ./install-ie   97.5 MB
aa803665e7c9        7 minutes ago       /bin/sh -c cd /tmp/repo && chmod -R 777 ./* &   3.035 GB
971d0a5cf5bb        8 minutes ago       /bin/sh -c echo 'root:root' | chpasswd && ssh   3.337 kB
08f9bc1672de        8 minutes ago       /bin/sh -c sed -i -E 's/^(\s*)system\(\);/\1u   2.36 kB
881becd1484e        8 minutes ago       /bin/sh -c yum install epel-release -y && yum   116.6 MB
a4b535ee16e1        8 minutes ago       /bin/sh -c useradd mqm && echo 'mqm:mqm' | ch   296.6 kB
d6a6cfad42c7        8 minutes ago       /bin/sh -c #(nop) COPY file:2c532c3326fd3416a   351 B
c82008c1ed35        8 minutes ago       /bin/sh -c #(nop) COPY dir:99b3084784de0d5d17   482.9 kB
c1942dfee5ab        8 minutes ago       /bin/sh -c #(nop) COPY dir:c11d65517cd68c846a   2.608 GB
67591570dd29        7 days ago          /bin/sh -c #(nop)  CMD ["/bin/bash"]            0 B
<missing>           7 days ago          /bin/sh -c #(nop)  LABEL name=CentOS Base Ima   0 B
<missing>           7 days ago          /bin/sh -c #(nop) ADD file:940c77b6724c00d420   191.8 MB

ilovemoney ()
Ответ на: комментарий от vrutkovs

сжимать тоже не варик, там образ вы выходе 15GB, и каждый релиз +200MB.

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

Ну тогда только переписывать dokerfile, чтобы всесто COPY в RUN копировались файлы и в том же RUNе после установки удалялись.

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

Мне интересно почему не отрабатывает --force-rm=true я почитал про нее, по идее - это то, что нужно.

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

Не, это походу удаляет сами контейнеры, запускаемые во время сборки, а не слои.

Deleted ()
Ответ на: комментарий от ilovemoney

как херовый вариант, можно попробовать запускать голый контейнер, монтировать Volume с установочными пакетами все инсталить «руками», делать commit. Только придется написать кучу кода для CI.

ilovemoney ()

Судя по цитатам ваших докерфайлов, вы ibm mq в контейнер запихиваете?

https://github.com/ibm-messaging/mq-docker/blob/master/server/Dockerfile - вот рандомный докерфайл для mq из гугла. Всего одна команда RUN вместо пяти, как у вас.

Суть в том, что каждая команда докера - это отдельный слой. То есть запустили COPY трех гигов - создался слой на три гига тяжелее. Потом позапускали всякие команды - еще новые команды (пять команд RUN - пять слоев). Потом вы удалили эти три гига - создался новый слой, в котором этих файлов нет (но в старом слое они остались). Чтобы такого не происходило, надо минимизировать докерфайлы и стремиться делать так, чтобы лишнее файло и появлялось, и удалялось одной командой.

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

Спасибо кэп=) Да MQ, но то, что вы скинули это не то у нас немного больше я не все скинул. Я прекрасно понимаю как надо, и когда мы поедем хотябы на тест все перепишется в красивый и правильный вид, и даже будет создаваться Ansibl-ом. Повторюсь еще раз, что проблема в размере пакетов, которые требуется установить. И с релизом их будет больше и больше. Вопрос как поместить пакеты для установки так, чтобы не создавался новый слой, для того, чтобы удалить их после установки...

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

С использованием COPY - никак. Заtarте их, выложите на какой-нибудь локальный сервер и делайте единую RUN-строчку вида wget && untar && ./install.sh && rm -rf ./. В таком случае у вас не будет создаваться слой с ненужными файлами, так как и в начале, и конце выполнения RUN-строки этих файлов не будет существовать.

Да, я понимаю, «мы потестим абы как, а потом сделаем нормально», но в данном случае сделать сразу нормально самым прямым образом влияет на размер.

Если прям совсем не хочется что-то менять на данный момент - docker run, затем docker commit временно решит проблему.

Ну или совсем странный вариант - ставьте тестовую ветку докера 1.13, там есть docker build --squash, который после успешного билда сжимает все слои в один.

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

как временно решение до лучших времен, буду использовать scp для доставки пакетов в контейнер, как протестируем и поймем, что шина и очередь нормально работает со всеми нашими сервисами, буду думать, что с этим делать. Всем спасибо за участие.

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

scp фигня, парни с overflow нашли в доках.

Because image size matters, using ADD to fetch packages from remote URLs is strongly discouraged; you should use curl or wget instead. That way you can delete the files you no longer need after they’ve been extracted and you won’t have to add another layer in your image

Я думаю - это самое оптимальное решение поднять статик-сервер, и wgetом тянуть нужные пакеты.

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

ONBUILD

Определяет инструкцию, которая должна быть выполнена позже, когда данный образ применяется в качестве базового уровня для другого образа. Это может быть полезным для обработки данных, которые будут добавлены в дочернем образе (т.е. эта инструкция может копировать в код из выбранного каталога и выполнять на текущих данных сценарий сборки).

https://docs.docker.com/engine/reference/builder/#/onbuild https://habrahabr.ru/company/infobox/blog/240623/

Прикрутив переменную ONBUILD - можно прописать хоть очистку директории при использовании его в следующий раз как базового образа.

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