Активировать 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