Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用复制到docker容器的python虚拟环境_Python_Docker - Fatal编程技术网

如何使用复制到docker容器的python虚拟环境

如何使用复制到docker容器的python虚拟环境,python,docker,Python,Docker,我已经安装了一个python包,并根据需要对其进行了修改,该包存储在一个venv文件夹中。我想用: RUN source venv/bin/activate 在我的Dockerfile中(当然是在将其复制到容器中之后)可以解决我的问题,但是对的注释显示它不能解决问题。后来,我遇到了一个演示如何在docker容器中设置新venv的例子,但没有回答我的问题。许多其他的答案让我陷入了无休止的疯狂追逐,所以我决定在这里提问。希望有一个好的答案能够解决我的问题,并为将来在docker容器中定制pytho

我已经安装了一个python包,并根据需要对其进行了修改,该包存储在一个venv文件夹中。我想用:

RUN source venv/bin/activate
在我的Dockerfile中(当然是在将其复制到容器中之后)可以解决我的问题,但是对的注释显示它不能解决问题。后来,我遇到了一个演示如何在docker容器中设置新venv的例子,但没有回答我的问题。许多其他的答案让我陷入了无休止的疯狂追逐,所以我决定在这里提问。希望有一个好的答案能够解决我的问题,并为将来在docker容器中定制python包时遇到这个问题的人提供服务

我的问题:

如何使用复制到docker容器中的venv?

通常,您不能将虚拟环境复制到任何地方,docker或其他地方。它们倾向于绑定到非常特定的文件系统路径和非常特定的Python安装。如果您知道您拥有完全相同的Python二进制文件,并将其复制到完全相同的文件系统路径,那么您可能可以按原样复制它,但构建系统将非常脆弱

在Docker中,您通常也不需要虚拟环境。Docker映像提供了与在非Docker上下文中使用虚拟环境相同的隔离Python安装。如果您通常通过运行

python3-mvpy
. vpy/bin/activate
pip安装-r requirements.txt
然后,您可以使用Dockerfile(如

来自python:3的

WORKDIR/app
复制requirements.txt。
运行pip安装-r requirements.txt
在注释中,您提示手动修改已安装的软件包。这通常不是最佳做法(如果您更改的软件包中有重要的安全更新怎么办?如果您的同事需要处理您的项目而不是您的计算机怎么办?)。您可以使用类似于diff(1)的工具制作一个补丁文件,描述所做的更改,并将修改后的文件与原始文件进行比较。如果你有,那么你可以做

COPY local.patch/app/
运行cd$(python3-c'import sysconfig;print(sysconfig.get_path(“platlib”)))\
&&补丁-p0

需要注意的是,每个RUN命令都会在一个新容器中启动一个新的shell。因此,最后一个示例中的
cd
命令只影响这个RUN命令,以后不会影响。在您建议的
RUN source…
命令中,由该命令设置的环境变量将在该RUN命令结束时丢失。(还要注意,
source
不是一个标准的shell命令,不能用于基于Alpine的图像,但是
是等效的,并且是标准的。)

通常在构建图像期间从
requirements.txt
重建虚拟环境。对,但是这些包将不会有我的自定义更改。然后您将自定义包添加到生成过程中。只需将它们复制到文件夹中?或者我还缺少其他东西?如果包中包含C代码,那么它就不可能正常工作。