Активировать python virtualenv в Dockerfile
У меня есть Dockerfile, где я пытаюсь активировать python virtualenv после чего, он должен установить все зависимости внутри этого env. Тем не менее, все еще устанавливается глобально. Я использовал разные подходы и не работал. У меня также нет ошибок. Где проблема?
1. ENV PATH $PATH:env/bin
2. ENV PATH $PATH:env/bin/activate
3. RUN. env/bin/activate
RUN. env/bin/activate
Я также последовал примеру конфигурации Dockerfile для образа python-runtime в Google Cloud, который в основном такой же, как и выше.
Установка этих переменных среды совпадает с запуском source/env/bin/activate.
ENV VIRTUAL_ENV/env
ENV PATH/env/bin:$PATH
Кроме того, что означает ENV VIRTUAL_ENV/env
и как оно используется?
Ответы
Ответ 1
Есть совершенно веские причины для использования virtualenv в контейнере.
Вам не обязательно активировать virtualenv для установки программного обеспечения или его использования. Попробуйте вместо этого вызвать исполняемые файлы непосредственно из каталога virtualenv bin
:
FROM python:2.7
RUN virtualenv /ve
RUN /ve/bin/pip install somepackage
CMD ["/ve/bin/python", "yourcode.py"]
Ответ 2
Вам не нужно использовать virtualenv внутри контейнера Docker.
virtualenv используется для изоляции зависимостей. Вы хотите предотвратить утечку любых зависимостей или пакетов из приложений. Докер выполняет одно и то же, он изолирует ваши зависимости внутри вашего контейнера и предотвращает утечки между контейнерами и между приложениями.
Поэтому нет смысла использовать virtualenv внутри контейнера Docker, если вы не запускаете несколько приложений в одном контейнере, если в этом случае я бы сказал, что вы делаете что-то неправильно, и решение будет заключаться в том, чтобы архитектовать приложение в лучший способ и разделить их на несколько контейнеров.
Ответ 3
Хотя я согласен с Маркусом в том, что это не способ сделать с Докером, вы можете делать то, что хотите.
Использование команды RUN Docker напрямую не даст вам ответа, поскольку он не выполнит ваши инструкции из виртуальной среды. Вместо этого сжимайте инструкции, выполняемые в одной строке, используя /bin/bash. Для меня работал следующий файл Dockerfile:
FROM python:2.7
RUN virtualenv virtual
RUN /bin/bash -c "source /virtual/bin/activate && pip install pyserial && deactivate"
...
Это должно установить pyserial модуль только в виртуальной среде.
Ответ 4
Если вы используете Python 3.x:
RUN pip install virtualenv
RUN virtualenv -p python3.5 virtual
RUN /bin/bash -c "source /virtual/bin/activate"
Если вы используете Python 2.x:
RUN pip install virtualenv
RUN virtualenv virtual
RUN /bin/bash -c "source /virtual/bin/activate"
Ответ 5
Установка этой переменной
ENV VIRTUAL_ENV /env
ENV PATH /env/bin:$PATH
не совсем то же самое, что просто бег
RUN . env/bin/activate
потому что активация внутри одного RUN
не повлияет ни на какие строки ниже этого RUN
в Dockerfile. Но установка переменных среды через ENV
активирует вашу виртуальную среду для всех команд RUN
.
Посмотрите на этот пример:
RUN virtualenv env # setup env
RUN which python # -> /usr/bin/python
RUN . /env/bin/activate && which python # -> /env/bin/python
RUN which python # -> /usr/bin/python
Так что если вам действительно нужно активировать virtualenv для всего Dockerfile, вам нужно сделать что-то вроде этого:
RUN virtualenv env
ENV VIRTUAL_ENV /env # activating environment
ENV PATH /env/bin:$PATH # activating environment
RUN which python # -> /env/bin/python