对于开发,我们使用virtualenv在依赖关系时进行隔离开发。从this question开始,建议在virtualenv中部署Python应用程序。
现在我们开始使用docker进行部署。这提供了一个更加孤立的环境,因此我质疑在docker容器中使用virtualenv。在单个应用程序的情况下,我不认为virtualenv有一个目的,因为docker已经提供隔离。在单个docker容器上部署多个应用程序的情况下,我认为virtualenv有一个目的,因为应用程序可能存在冲突的依赖关系。
在docker容器中部署单个应用程序时是否应该使用virtualenv?
Docker是否应包含多个应用程序或每个容器只包含一个应用程序?
如果是这样,在部署具有多个应用程序的容器时是否应该使用virtualenv?
答案 0 :(得分:59)
Virtualenv早在docker之前创建。今天,由于以下原因,我倾向于使用docker而不是virtualenv:
Docker的主要缺点是Windows支持不佳。随着Windows 10的版本而改变。
至于"每个容器有多少个应用程序",通常的政策是1.
答案 1 :(得分:29)
是。你仍然应该使用virtualenv。此外,你现在应该建造轮子而不是鸡蛋。最后,您应该确保通过使用完整的构建工具在容器中构建轮子并在应用程序容器中不安装构建工具来保持Docker镜像的精简和高效。
你应该阅读这篇优秀的文章。 https://glyph.twistedmatrix.com/2015/03/docker-deploy-double-dutch.html
关键是拿走
在许多情况下,甚至大多数情况下,只需安装即可 用Pip进入系统Python的工作正常;但是,更多 精心设计的应用程序,您可能最终想要调用工具 由您在Python中实现的基本容器提供,但是 这需要主机管理的依赖项。通过放东西 无论如何,我们保持基础设置的东西 image的包装系统整齐地分开了我们的东西 应用程序正在构建,这意味着应该没有不可预见的 交互,无论应用程序的使用有多复杂 Python可能是。
答案 2 :(得分:11)
介绍virtualenv非常简单,所以我说在你的docker容器上没有它就开始了。
如果需要,那么也许你可以安装它。运行" pip freeze> requirements.txt"将为您提供所有的python包。 但是,我怀疑你在docker容器中是否需要virtualenv,因为创建另一个容器将是更好的选择。
我不建议在一个容器中安装多个应用程序。当你到达这一点时,你的容器做得太多了。
答案 3 :(得分:0)
如果有人想用docker完全取代virtualenv,他可以。
只需为不同的环境创建不同的Dockerfile,并根据环境需要使用端口和卷。
作为开发示例,您可以使用此project。运行docker撰写并开始编码。 通过将日志和数据放入卷中,为不同的环境(如测试,登台和生产)编写自己的Dockerfiles。
答案 4 :(得分:0)
我同时使用这两种方法,是因为您可以更轻松地使用multi stage builds,并且只需将在一个阶段中构建的依赖项移动到以后的图像/图层中即可。可以找到示例here。