使用docker时virtualenv是否达到目的(在生产中)?


69

对于开发,在涉及依赖项时,我们使用virtualenv进行独立开发。从这个问题来看,似乎在 被推荐。

现在我们开始使用 进行部署。这提供了一个更隔离的环境,因此我质疑docker容器内virtualenv的使用。对于单个应用程序,我不认为virtualenv有目的,因为docker已经提供了隔离。在将多个应用程序部署在单个docker容器上的情况下,我确实认为virtualenv具有用途,因为这些应用程序可能具有冲突的依赖关系。

在Docker容器中部署单个应用程序时应使用virtualenv吗?

docker应该包含多个应用程序,还是每个容器仅包含一个应用程序?

如果是这样,那么在部署具有多个应用程序的容器时是否应该使用virtualenv?


1
我认为您有正确的问题。当具有一组同时运行的python应用程序时,您将需要virtualenv以避免从一个容器到另一个容器浏览...我建议默认情况下使用virtualenv,即使该容器专用于在一个容器上工作也是如此。单一应用程式,因为...好吧,您永远不知道。而且virtualenv引起的开销不是很高:)
Rerito

1
@Rerito使用docker没有开销。它只是Linux上的chroot监狱。
阿米尔·侯赛因(AmirHossein)

Answers:


68

Virtualenv是在docker之前创建的。今天,由于以下原因,我倾向于docker而不是virtualenv:

  • Virtualenv仍然意味着消费您产品的人们需要下载鸡蛋。有了docker,他们得到了“可以正常工作”的东西。没有任何附加条件。
  • Docker的功能远不止virtualenv(例如,当您拥有需要不同Python版本的产品时,创建一个干净的环境)。

Docker的主要缺点是Windows支持不佳。对于Windows 10版本,情况有所改变。

至于“每个容器有多少个应用程序”,通常的策略是1。


1
要在Windows(或OS X)上使用docker,我建议boot2docker
siebz0r 2014年

1
5s在Windows上启动docker的速度非常快,但仍比Linux上的平均启动时间慢约100倍:-)
Aaron Digulla 2014年

这些观点仍然适用于docker吗?(对Windows的支持不佳)
Ani

1
@Ani不,截至2017年11月,我想说Windows 10和Linux docker几乎相等。
亚伦·迪古拉

我在2018年更新,目前Windows支持与基于UNIX的操作系统相同。
肯尼·阿尔维祖瑞斯

34

是。您仍然应该使用virtualenv。另外,您现在应该在建造轮子而不是鸡蛋。最后,应通过使用完整的构建工具在容器中构建轮子并在应用程序容器中未安装任何构建工具来确保保持Docker映像的精简和高效。

您应该阅读这篇出色的文章。https://glyph.twistedmatrix.com/2015/03/docker-deploy-double-dutch.html

关键带走的是

的确,在很多情况下,甚至大多数情况下,只需使用Pip将东西安装到系统Python中就可以了。但是,对于更复杂的应用程序,您可能最终想要调用基本容器提供的工具,该工具已在Python中实现,但需要由主机管理的依赖项。通过将所有内容放到virtualenv中,我们将基本映像的打包系统设置的内容与应用程序正在构建的内容整齐地分开,这意味着不应存在不可预见的交互作用,无论应用程序使用Python的复杂程度如何是。


10
PEP370引入了--user标志(在2008年),该标志允许在$ HOME中安装软件包。这可以解决我以前用于virtualenv / pyvenv的99%用例。我想请记住。
赛塞尔赛

6
我只是没有同意而投下反对票。这对任何人有什么帮助?
Bruno Bronosky '16

4
如果您使用样本中使用的过大的容器操作系统(如ubuntu),这可能是正确的。但是,如果您选择正确的操作系统(如Alpine),则不是问题。Alpine出厂时没有提供Python,因此您知道Python安装在那里是因为您安装了它是因为您的应用程序需要它。
Daniel F

12

引入virtualenv非常容易,因此我想在docker容器中不添加它就开始。

如果需要,那么也许您可以安装它。运行“ pip Frozen> requirements.txt”将为您提供所有python软件包。但是,我怀疑您是否会在docker容器内需要virtualenv,因为创建另一个容器会是更可取的选择。

我不建议在一个容器中有多个应用程序。当您到达这一点时,您的容器就做得太多了。


1

之所以使用这两种方法,是因为这样您可以更轻松地使用多阶段构建,并且只需将在一个阶段中构建的依赖项移动到以后的图像/图层中即可。示例可以在这里找到。


0

如果有人想使用docker完全替换virtualenv,他可以。

只需为不同的环境创建不同的Dockerfile,然后根据需要使用端口和卷。

作为开发示例,您可以使用此项目。运行docker compose并开始编码。通过将日志和数据批量存储,为不同的环境(例如测试,登台和生产)编写自己的Dockerfile。

该链接对https://vsupalov.com/docker-python-development/也很有用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.