我有一个python软件包,已安装并修改以满足我的需求,该软件包存储在venv文件夹中。我以为使用了
RUN source venv/bin/activate
在我的Dockerfile中将(当然,将其复制到容器中之后)可以解决我的问题,但是对this answer的评论表明它没有。之后,我碰到了this article,它显示了如何在Docker容器中设置新的venv,但没有回答我的问题。许多其他答案使我无休止地追逐,所以我决定在这里提问。希望一个好的答案能够解决我的问题,并为将来将要在docker容器中使用自定义python软件包的人解决此问题。
我的问题:
如何使用复制到docker容器中的venv?
答案 0 :(得分:1)
通常,您无法在任何地方(Docker或其他方式)复制虚拟环境。它们往往与非常特定的文件系统路径和特定的Python安装相关。如果您知道您拥有相同的Python二进制文件 exact ,并将其复制到了相同的文件系统路径 exact ,则可以按原样复制它,但是构建系统会非常脆弱。
通常情况下,您在Docker中不需要虚拟环境。 Docker映像提供了与在非Docker上下文中使用虚拟环境相同的隔离Python安装类型。如果您通常通过运行来设置虚拟环境
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命令都会在新容器中启动一个新的Shell。因此,在上一个示例中,cd
命令 only 仅影响此RUN命令,以后不再起作用。在您建议的RUN source ...
命令中,由此设置的环境变量将在该RUN命令的末尾丢失。 (还请注意,source
不是标准的shell命令,并且不适用于基于Alpine的图像,但是.
是等效的并且是标准的。)