【问题标题】:What is the purpose of running a django application in a virtualenv inside a docker container?在 docker 容器内的 virtualenv 中运行 django 应用程序的目的是什么?
【发布时间】:2017-02-25 14:44:57
【问题描述】:

docker django 应用程序中 virtualenv 的用途是什么? Python和其他依赖已经安装好了,但同时需要使用pip安装很多包,所以冲突似乎还不清楚。

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

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

【问题讨论】:

    标签: python django docker virtualenv


    【解决方案1】:

    Docker 和容器化可能会激发您不需要虚拟环境的错觉。 distutil 的 Glpyh 对这种误解 in this pycon talk 提出了非常有说服力的论据。

    virtualenv 优势的基本方面适用于容器,就像它们适用于非容器化应用程序一样,因为从根本上说,您仍在运行 linux 发行版。

    Debian 和 Red Hat 是极其复杂的工程项目。 集成数十亿行C代码。例如,你可以apt install libavcodec。或yum install ffmpeg

    编写工作构建 其中一件事的系统是博士论文。他们整合 数以千计的 Python 包同时集成到一个工作中 环境。他们并不总是告诉你他们的工具是否使用 Python 或不。

    因此,您可能希望 docker exec 在一个 容器,它们可能是用 Python 编写的,如果你 sudo pip install 你的应用程序在那里,现在都坏了

    因此,即使在容器中,也要将您的应用程序代码与系统的

    隔离开来

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

    现在在 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
    

    【讨论】:

    • @SebestianWozny 非常广泛的答案,谢谢。我已经用问题的可能示例(如果它真的相关而不是我的错误)编辑了我的问题。
    • 你可能犯了一个错误,virtualenv 没有在每一行都运行它。
    • 你也应该这样做 pip install djangorestframework 而不是 pip freeze
    【解决方案2】:

    virtualenv 用于将包隔离到特定环境。 Docker 还可以将设置隔离到特定环境。所以本质上,如果你使用 docker,那么使用 virtualenv 也没有太多好处。

    直接 pip install 到 docker 环境中,不会有什么坏处。要 pip 安装要求,请使用 dockerfile,您可以在其中执行命令。

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

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

    【讨论】:

    • 用 pip 安装东西到 docker 的命令是什么?不能有任何路径冲突
    • @Vinand 我添加了一个示例。这不应该有任何路径冲突,因为当您使用 pip 安装时,pip 会在 docker 环境中全局安装东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多