在docker容器内的virtualenv中运行django应用程序的目的是什么?

docker django应用程序内的virtualenv的目的是什么? Python和其他依赖已经安装,但同时需要使用pip安装大量的包,所以似乎冲突仍然不清楚。

你能解释一下这个概念吗?

编辑:另外,例如。 我创build了pip freeze djangorestframework django应用程序中的virtualenv,最近安装了pip freeze djangorestframework ,并将其添加到settings.py中,但是pip freeze djangorestframework docker-compose up引发了错误. No module named rest_framework. . No module named rest_framework. 检查,一切都是正确的. Docker / virtualenv冲突? 希望如此?

Docker和集装箱化可能会激发你不需要虚拟环境的错觉。 distutil的Glpyh 在这个pycon谈话中对这种误解提出了一个非常有说服力的观点。

virtualenv优点的相同的基本方面适用于非容器化应用程序的容器,因为从根本上说,你仍然在运行linux发行版。

Debian和Red Hat是非常复杂的工程项目。 整合数十亿行C代码。例如,您可以apt install libavcodec 。 或者yum install ffmpeg

为这些事情之一写一个工作build立系统是博士论文。 他们将数千个Python软件包同时集成到一个工作环境中。 他们并不总是告诉你他们的工具是否使用Python。

所以,你可能想要在容器中执行一些工具,如果你用sudo pip install在那里sudo pip install你的应用程序,那么它们可能是用Python编写的, 现在已经全部损坏了

所以即使在容器中,也要将你的应用程序代码与系统隔离

无论您是否使用docker,都应该在虚拟环境中运行应用程序。

现在在docker中,使用virtualenv比应该有点棘手。 在Docker内部,每个RUN命令都是独立运行的,除了文件系统更改以外,没有其他任何状态保持不变。 要安装到virutalenv你必须在每行上加上激活命令 :

 RUN apt-get install -y python-virtualenv RUN virtualenv /appenv RUN . /appenv/bin/activate; \ pip install -r requirements.txt ENTRYPOINT . /appenv/bin/activate; \ run-the-app 

一个虚拟环境就是将软件包隔离到一个特定的环境中。 Docker也可以将设置隔离到特定的环境。 所以实质上如果你使用docker,那么使用virtualenv也没有什么好处。

只需要将一些东西直接安装到docker环境中就没有任何坏处。 要点安装的要求使用dockerfile你可以执行命令。

您可以在下面find一个伪代码示例。

 FROM /path/to/used/docker/image RUN pip install -r requirements.txt