Докер: постоянный источник файла при создании изображения - PullRequest
0 голосов
/ 21 июня 2019

Я следую этим инструкциям по созданию docker образа из python3.7, который также содержит ruby - мне нужно 2.1.5 специально (не спрашивайте).

Итак, мой Dockerfile такой:

FROM python:3.7

SHELL ["/bin/bash", "-c"]


RUN apt-get update \
    && apt-get install -y --no-install-recommends \
    build-essential \
    curl \
    dirmngr \
    gnupg2 \
    && curl -sSL https://rvm.io/mpapis.asc | gpg2 --import - \
    && gpg2 --keyserver hkp://pool.sks-keyservers.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB \
    && curl -sSL https://get.rvm.io |  bash -s stable \
    && usermod -a -G rvm root \
    && source /etc/profile.d/rvm.sh \
    && rvm install ruby-2.1.5

Сборка завершается успешно, но конечное изображение не имеет ruby на своем пути, что является результатом этой команды source /etc/profile.d/rvm.sh, фактически не имеющейэффект во время сборки.

Как только я получаю cmd в контейнере и запускаю его, ruby становится доступным.

Почему это так?

Ответы [ 2 ]

0 голосов
/ 21 июня 2019

Если вы создадите сценарий в оболочке, которая существует только для этой команды, он не будет иметь никакого долгосрочного эффекта для любых будущих команд.

Попробуйте это:

RUN /bin/bash -c "source /etc/profile.d/rvm.sh; command1; command2; command3;"
0 голосов
/ 21 июня 2019

См. this :

Инструкция RUN выполнит любые команды в новом слое поверх текущего изображения и зафиксирует результаты.

Итак, все RUN в Dockerfile будут влиять только на сборку изображения, а не на контейнер.Вы должны поставить любой source в entrypoint или cmd.Или сделайте символьную ссылку в Dockerfile, чтобы связать ее с /bin/.

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