容器中使用conda的目的是什么?

21

我看到很多Dockerfile里都有conda命令的示例。而且也有预构建的Anaconda和Miniconda容器。我一定是忽略了什么。

Docker难道不是替代virtualenv和conda吗?我应该把所有依赖都放在dockerfile中,对吗?我不理解为什么要在这里添加Anaconda。实际上,如果我不使用所有Miniconda包含的模块,似乎会使我的容器变得更大。


虽然你的观点似乎是正确的,但我想补充一下:Docker有许多不同的用例,其他需求或知识水平可能需要在Dockerfile中采用非常不同的方法。 - Klaus D.
4
这条评论帮助不大。所以,您可能会在容器中使用conda,因为...“用例”?好的,您引起了我的兴趣。这些用例实际上是什么样子的? - red888
我没有特别想法,但我可以想象一些包含“之前只用过conda”或“我正在Windows上开发,现在我必须构建一个Docker东西”的内容。 - Klaus D.
1个回答

12

Docker并不能替代任何东西。它只是一种做事情的方式。

不,你不应该把所有依赖都写在Dockerfile里。我自己会从虚拟环境中运行pip install,除非有充分的理由需要用到Docker或者Conda。你没有提供requirements.txt文件并不是一个好的理由 :)

Conda早在2012年就已经出现了——比Docker还早。由于Python在非程序员社区中有很强的支持者,我很少能看到可读的代码,更别说某些类型的DevOps能力了。Conda就是这个群体的完美解决方案。

使用Docker,你可以通过FROM python:xx, COPY . /workdir, 和 RUN pip install -r requirements.txt(假设你正在使用这个文件 *啊咳咳)获得一个功能性的Docker环境,但是你的开发人员可能需要一个卷才能进行开发工作(所以他们需要知道--volume)。此外,如果你正在运行Django,则需要配置端口(现在他们需要--port并且你需要EXPOSE)。哦,还有Django可能需要一个数据库。现在你需要另一个容器并编写一个docker-compose文件。

但是请考虑以下几点,几乎所有我的专业(DevOps)经验都表明——如果你只包含requirements.txt:

  • 我可以在我的Docker容器中使用该文件
  • 依赖项都在一个地方
  • 我可以在本地使用虚拟环境进行开发
  • Travis可以通过requirements.txt安装并在多个版本上测试,而不需要使用Tox
  • Setuptools自动处理这一过程,因此我的东西能够与pip配合使用
  • 我可以重复使用那些Dockerfile(或部分)与ECS、Kubernetes等等
  • 我可以不使用Docker将软件包部署到EC2上
  • 我可以通过pip在本地安装软件包

希望对您有所帮助——不要被某种技术束缚住了!


5
Docker最初发布于2013年。尽管这对我来说更有意义,但你的论点仍然基本上是“在本地开发中使用conda代替docker,因为开发人员无法费心去弄清楚”是吗?容器的主要卖点之一不是一致性吗?你可以为本地开发配置django和DB容器,以便所有开发人员都可以在相同的环境中进行开发,而不是配置他们自己的本地django和DB设置(这比compose更简单?) - red888
2
不,我的表述可能有些不清楚。对此我感到抱歉。我建议给他们提供一个使用主机名的docker-compose文件,这样他们只需要运行“docker-compose up -d”,然后在浏览器中输入http://myapp即可。通过这种方式,我用一种同样简单(对于他们来说)但更加强大的方式替换了Conda。但是,我必须小心使用Mac上的Docker,因为Docker声称存在一些网络问题是苹果公司的问题。 - onwsk8r
1
刚想到另一件事,目前容器的调试支持不是很流畅,所以在本地运行Python来执行像附加调试器这样的操作可能更容易些。 - red888
2
是的,如果你在Mac上运行,你会遇到这些问题,并且如果你在Windows上运行,谁知道会发生什么。当然,不同版本也存在问题。如果我们只关注开发人员,Docker很方便,因为他们只需要学习一种与语言无关的软件,如果他们不想了解环境,也不需要知道任何东西。 - onwsk8r

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接