docker django应用程序中virtualenv的目的是什么? Python和其他依赖项已经安装,但同时需要使用pip安装大量软件包,所以看起来冲突仍然不明确。
你能解释一下这个概念吗?
编辑:此外,例如。我在docker django应用程序中创建了virtualenv,最近安装了pip freeze djangorestframework
并将其添加到settings.py中,但docker-compose up
引发了错误. No module named rest_framework.
已检查,一切正确.
Docker / virtualenv冲突?可能是吗?
答案 0 :(得分:8)
Docker和容器化可能会激发您不需要虚拟环境的错觉。 distutil
的Glpyh对这种误解提出了非常有说服力的论据in this pycon talk。
virtualenv
优势的相同基本方面适用于容器,就像它们用于非容器化应用程序一样,因为从根本上说,您仍在运行Linux发行版。
Debian和Red Hat是一个非常复杂的工程项目。 集成数十亿行C代码。例如,您只需
apt install libavcodec
。或yum install ffmpeg
。编写工作版本 其中之一的系统是博士论文。他们整合 成千上万的Python包同时进行一次工作 环境。他们并不总是告诉你他们的工具是否使用Python 或不。
所以,您可能希望docker exec中的一些工具 容器,如果你
sudo pip install
,它们可能是用Python编写的 你的应用程序在那里,现在它已经全部破坏了。即使在容器中,也要将应用程序代码与系统隔离
无论您是否使用泊坞窗,都应该始终在虚拟环境中运行应用程序。
现在在docker中,特别是使用virtualenv比它应该有点棘手。在docker内部,每个RUN
命令都是独立运行的,除了文件系统更改之外,没有任何状态保持在一行到另一行。要安装到virutalenv
,您必须预先设置激活command on every line:
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
答案 1 :(得分:3)
virtualenv用于将软件包隔离到特定环境。 Docker也可以将设置隔离到特定环境。所以从本质上讲,如果你使用docker,那么使用virtualenv也没什么好处。
直接将安装东西直接插入docker环境中它不会造成任何伤害。要点击安装需求,请使用dockerfile执行命令。
您可以在下面找到伪代码示例。
FROM /path/to/used/docker/image
RUN pip install -r requirements.txt