Как использовать виртуальную среду Python, скопированную в Docker-контейнер - PullRequest
2 голосов
/ 30 июня 2019

У меня есть пакет python, который я установил и изменил в соответствии с моими потребностями, который хранится в папке venv. Я думал, используя:

RUN source venv/bin/activate

в моем Dockerfile (конечно, после копирования в контейнер) решит мои проблемы, но комментарии к этому ответу показали, что это не так. После этого я наткнулся на эту статью , которая показывает, как настроить новый venv внутри контейнера докера, но не отвечает на мой вопрос. Многие другие ответы отправили меня на бесконечную дикую погоню, поэтому я решил спросить здесь. Надеюсь, хороший ответ решит мою проблему и послужит тем, кто столкнется с этой проблемой в будущем, для пользовательских пакетов python в докер-контейнерах.

Мой вопрос:
Как использовать venv, скопированный в док-контейнер?

1 Ответ

1 голос
/ 30 июня 2019

Как правило, вы не можете копировать виртуальные среды где-либо, Docker или иным образом. Они имеют тенденцию быть привязанными к очень специфическому пути файловой системы и довольно специфической установке Python. Если вы знали, что у вас есть точный тот же двоичный файл Python, и вы скопировали его в точный тот же путь к файловой системе, вы, вероятно, можете скопировать его как есть, но система сборки будет чрезвычайно хрупкий.

Это также тот случай, когда вам обычно не нужны виртуальные среды в Docker. Образ Docker обеспечивает тот же вид изолированной установки Python, для которого вы бы использовали виртуальную среду в контексте, отличном от Docker. Если вы обычно настраиваете виртуальную среду, запустив

python3 -m venv vpy
. vpy/bin/activate
pip install -r requirements.txt

тогда вы можете получить эквивалентную установку с Dockerfile, например

FROM python:3
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt

В комментариях вы намекаете на ручную модификацию установленных пакетов. Обычно это не лучшая практика (что если в пакете, который вы изменили, есть критическое обновление для системы безопасности, что если вашему коллеге нужно работать над вашим проектом, а не на вашем компьютере?). Вы можете использовать такой инструмент, как diff (1), чтобы создать файл патча, описывающий, что изменилось, сравнивая ваш измененный файл с оригиналом. Если у вас есть это, вы можете сделать что-то вроде

COPY local.patch /app/
RUN cd $(python3 -c 'import sysconfig; print(sysconfig.get_path("platlib"))') \
 && patch -p0 < /app/local.patch

Важно отметить, что каждая команда RUN запускает новую оболочку в новом контейнере. Таким образом, команда cd в последнем примере only влияет на эту команду RUN и ничего позже. В предложенной вами команде RUN source ... переменные среды, установленные этим, будут потеряны в конце этой команды RUN. (Также обратите внимание, что source не является стандартной командой оболочки и не будет работать, например, с изображениями на основе Alpine, но . эквивалентен и является стандартным.)

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