我正在寻求有关如何在docker上下文中管理python模块的建议。
我知道的当前选项包括:
requirments.txt
的构建过程中通过pip将它们安装在一起理想情况下,如果我决定添加另一个模块或更新其中一个模块的版本,则我希望该解决方案能够完全重现,并且不需要重新安装每个模块。
从我的角度来看:
(2)是一个问题,因为docker ADD
命令(用于访问requirements.txt
文件)显然使缓存无效,并且意味着对该文件的任何更改都意味着必须重新构建/重新构建所有内容。 -每次生成映像时都安装。
(1)保持缓存完整无缺,但是这意味着您需要为每个软件包指定确切的版本(以及潜在的依赖关系?),这似乎很繁琐且容易出错。
(3)当前是我个人最喜欢的,因为它允许软件包在映像/构建之间保留并允许使用requirements.txt
。唯一的缺点是,实际上您是将软件包存储在本地计算机上,而不是将映像存储在本地计算机上,而导致容器依赖于主机操作系统,这有点违反了容器的观点。
所以,我不确定我的最佳实践是什么,不胜感激。
作为参考,关于此主题还有其他问题,但我认为其中任何一个都不能正确解决我的上述问题:
docker with modified python modules?
Docker compose installing requirements.txt
How can I install python modules in a docker image?
编辑:
只是一些其他注释,以提供更多背景信息。我的项目通常专注于数据分析(而不是软件开发或Web开发)。我倾向于使用docker compose来管理多个图像(对于python来说是1个,对于R来说是1个,对于数据库来说是1个)。到目前为止,我一直在主机操作系统上使用makefile从头开始重建项目,例如
some_output.pdf: some_input.py
docker-compose run python_container python some_input.py
将输出写入主机OS上的卷
答案 0 :(得分:2)
df2 = pd.DataFrame(np.where(df1, 'yes', ''),
index=df1.index,
columns=df1.columns)
print (df2)
all_india any_india non_india
Q Name
INTERNET yes
RF yes
TOOLS yes
文件是最佳选择。 (即使进行了更改也可以完全重新安装。)
新的开发人员开始您的项目。他们签出您的源代码控制存储库,然后说:“哦,这是一个Python项目!”,创建一个虚拟环境,然后运行requirements.txt
,然后开始运行。一周后,他们来了,说“那么我们该如何部署呢?”,但是由于您已经将普通的Python安装程序包装在Docker中,因此他们不必费劲地使用特定于Docker的怪异开发流程
灾难!主服务器的硬盘已崩溃!您已经备份了所有数据,但是应用程序代码只是从源代码控制中重建的。如果要将 code 保留在Docker卷(或绑定安装的主机目录)中,则需要弄清楚如何重建它。但您的前两个选项已在pip install -r requirements.txt
中写下。这对于上一段中的新开发人员(他们想要在部署之前先在本地测试其映像)以及想要在其中部署映像而不是在其上部署任何类型的基于集群的部署系统(Swarm,Kubernetes)也很重要。还必须手动在部署系统框架之外将代码与代码一起部署。
答案 1 :(得分:0)
另一种选择是使用multi-stage build feature。创建一个安装依赖关系的中间版本,然后将文件夹复制到生产映像中(第二个构建阶段)。这也为您提供了选项3的好处。
这取决于构建中哪一步比较昂贵,并且可以从缓存中受益。比较以下内容:
FROM Ubuntu:16.04
安装Python,Pip等。 添加requirements.txt 运行pip install
运行昂贵的构建步骤。
FROM Ubuntu:16.04 AS中级 安装Python,Pip等 添加requirements.txt 运行pip install
FROM Ubuntu:16.04
运行昂贵的构建步骤。
COPY --from = intermediate / pip-packages / / pip-packages /
在第一种情况下,触摸您的requirements.txt将强制进行完整构建。在第二种情况下,仍然会缓存您昂贵的构建步骤。中间版本仍在运行,但我认为这不是昂贵的步骤。