python - 如何使用 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。这似乎合乎逻辑,但我不确定它是否是最佳解决方案。我也没有看到一种优雅的方式来跟踪进度或报告错误。
非常感谢任何见解。
解决方案
我会研究一个排队系统,例如RabbitMQ。这将使您有四个队列,每个任务一个,并让您跟踪事物的位置,并一次在每种可能的状态下拥有多个事物。你可以有四个独立的长时间运行的容器,它们都在这些队列之一中工作,如果你需要更多的处理能力来进行分析阶段,你可以启动容器的多个副本。
当您提出问题时,它实际上听起来并不太复杂,您应该考虑在单个进程/脚本/容器中运行它的优点。(例如,“从某个磁盘位置获取数据并将其复制到数据库”的最后一步可能更容易与前面的步骤合并;如果整个管道简化为“获取数据、处理并保存”它不将其称为“管道”可能更简单。)
您几乎绝对不应该创建docker run
或docker exec
成为核心处理流程的一部分。如果您可以运行这些 Docker 命令中的任何一个,那么您实际上可以对主机系统执行任何操作:有一些您不想考虑的主要安全注意事项。根据您的环境,您可能还希望避免一些启动成本(例如,涉及 JVM 的任何事情仍然需要 ~forever 才能出现)。长时间运行的工作容器通常是更好的模型。
推荐阅读
- android - Android Activity 是在应用程序进程中启动的,尽管它是从其他进程开始的
- python - Python - 我可以用 for 循环打印出具有连续数字的变量吗?
- vue.js - 如何使用 vuex 通过 vuejs 中的道具获取状态项
- angular - 如何在角度 4 中执行搜索功能?
- python - 抓住一个或两个单词 IF 在一个模式后大写并将结果与另一个列表匹配
- java - Spring @Value 资源注入测试和主要资源
- sql - 有没有办法将 Postgresql 的 using 与附加子句结合起来?
- javascript - PHP Javascript - 在 PHP session_destroy 上保留 localStorage
- android - 视频加水印命令
- mule - Mule-使用 dataweave 从 Json 对象中提取密钥