Как правило, вы не можете копировать виртуальные среды где-либо, 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, но .
эквивалентен и является стандартным.)