首页 > 解决方案 > 如何使用 docker 和 python 创建和跟踪处理链

问题描述

我正在研究一系列我计划放入他们自己的容器中的过程。这是一个简单的分步过程,但我不确定从一个容器获取数据到下一个容器的最佳方法是什么,或者如何跟踪进度。通常我会制作活动 2、3 和 4 单独的脚本并将它们全部导入活动 1。现在每个活动都将是一个单独的容器,我不知道该怎么做。

活动 1 - 提供 2d 形状矢量。将此传递给活动 2。
活动 2 - 根据活动 1 中提供的形状下载图像。
活动 3 - 下载图像后运行一些分析。
活动 4 - 分析完成后运行统计信息并将信息保存到数据库。

一种想法是使用 docker run 和入口点。活动 1 会在某个时候运行活动 2,它将 python 脚本作为入口点。

docker run activity2 "inputVectorFromActivity1"

另一种选择是使用环境变量

docker run activity2 -e INVECTOR="inputVectorFromActivity1"

因此,在这些示例中,活动 1 将调用 2,后者将调用 3,后者将调用 4。这似乎合乎逻辑,但我不确定它是否是最佳解决方案。我也没有看到一种优雅的方式来跟踪进度或报告错误。

非常感谢任何见解。

标签: pythondocker

解决方案


我会研究一个排队系统,例如RabbitMQ。这将使您有四个队列,每个任务一个,并让您跟踪事物的位置,并一次在每种可能的状态下拥有多个事物。你可以有四个独立的长时间运行的容器,它们都在这些队列之一中工作,如果你需要更多的处理能力来进行分析阶段,你可以启动容器的多个副本。

当您提出问题时,它实际上听起来并不太复杂,您应该考虑在单个进程/脚本/容器中运行它的优点。(例如,“从某个磁盘位置获取数据并将其复制到数据库”的最后一步可能更容易与前面的步骤合并;如果整个管道简化为“获取数据、处理并保存”它不将其称为“管道”可能更简单。)

您几乎绝对不应该创建docker rundocker exec成为核心处理流程的一部分。如果您可以运行这些 Docker 命令中的任何一个,那么您实际上可以对主机系统执行任何操作:有一些您不想考虑的主要安全注意事项。根据您的环境,您可能还希望避免一些启动成本(例如,涉及 JVM 的任何事情仍然需要 ~forever 才能出现)。长时间运行的工作容器通常是更好的模型。


推荐阅读