为什么人们在docker容器中创建virtualenv?

Lia*_*odi 20 python virtualenv docker

您可以在几秒钟内使用Dockerfile构建容器,那么为什么人们需要在docker容器中安装虚拟环境?

它就像虚拟机中的"虚拟机"?

gru*_*gru 23

我在Docker中使用virtualenvs,我认为有几个原因:

  1. 您可能希望将您的应用程序与系统的python包隔离开来
  2. 你可能想运行python的自定义版本,但仍然保持系统的包不受影响
  3. 您可能需要对为特定应用程序安装的软件包进行细粒度控制
  4. 您可能需要运行具有不同要求的多个应用程序

我认为这些都是pip install virtualenv在安装结束时添加一点的合理的理由!:)

  • 由于码头策略倾向于"每个容器一个应用程序",第四点可能不是一个好理由. (13认同)
  • @Davos是的,当然,这不是你需要运行的唯一东西,我的评论并不意味着你需要添加到dockerfile.特别是,使用python3,您甚至不需要安装额外的软件包来创建内置的virtualenv (4认同)
  • 您是否不需要在 dockerfile 中先“RUN pip install virtualenv”,创建 virtualenv 目录,然后在其中“pip install”其余软件包,而不是在安装结束时? (2认同)
  • 所以这个答案已经有几年了,但是你仍然提倡在 docker 容器中使用 virtualenv 吗?我问是因为两者都应该提供一个隔离级别,那么如果容器应该用于一个应用程序和一个目的,为什么需要两个级别的隔离? (2认同)

ste*_*fen 9

这是我的两分钱,或者是对@gru的答案的评论以及一些评论。

  • docker和虚拟环境都不是虚拟机
  • docker文件中的每一行都会产生开销。但确实,在运行时虚拟环境的影响为零
  • 泊坞窗容器的想法是,您有一个进程以客户端-服务器关系与其他(泊坞窗)服务进行交互。在一个泊坞窗中运行不同的应用程序,或者在泊坞窗中从另一个泊坞窗调用一个应用程序在某种程度上违背了这一想法。更重要的是,它增加了您要避免的docker复杂性。
  • 仅在需要确保一个或多个软件包的特定版本时,才有必要从docker中安装的软件包中“隔离”应用程序在虚拟环境中看到的python软件包。
  • 安装在容器中的系统仅充当您正在运行的一个应用程序的环境。根据您的应用程序要求进行调整。无需将其保持“不变”

因此,总而言之:没有充分的理由在容器内使用虚拟环境。在系统上安装所需的任何软件包。如果您需要控制确切的软件包版本,请使用pip或类似版本安装(docker-wide)。

如果您认为需要在一个容器中运行具有不同程序包版本的不同应用程序,请退后一步,重新考虑您的设计。您将面临更多的复杂性,更困难的维护和更多麻烦。将工作/服务分成几个容器。

  • 我第二。很好的解释。 (2认同)