如何在完美流程中使用自定义docker存储?

如何在完美流程中使用自定义docker存储?,docker,dask,prefect,Docker,Dask,Prefect,我已经设置了一个Dask集群,我很高兴地向它发送基本perfict流。 现在,我想做一些更有趣的事情,用我的python库创建一个自定义docker映像,并在dask集群上执行流/任务 我的假设是,我可以让dask集群(调度程序和工作程序)与它们自己的python环境保持原样(在检查了所有不同的消息传递库之后,它们到处都有匹配的版本)。也就是说,如果流在我的自定义存储中执行,我不希望需要将我的库添加到这些机器中。 但是,要么我没有正确设置存储,要么假设上述情况不安全。换句话说,当在自定义库中pi

我已经设置了一个
Dask
集群,我很高兴地向它发送基本
perfict
流。 现在,我想做一些更有趣的事情,用我的python库创建一个自定义docker映像,并在dask集群上执行流/任务

我的假设是,我可以让dask集群(调度程序和工作程序)与它们自己的python环境保持原样(在检查了所有不同的消息传递库之后,它们到处都有匹配的版本)。也就是说,如果流在我的自定义
存储中执行,我不希望需要将我的库添加到这些机器中。
但是,要么我没有正确设置存储,要么假设上述情况不安全。换句话说,当在自定义库中pickle对象时,Dask集群确实需要了解我的python库。假设我有一个名为
data
的通用python库

导入完美
从perfict.engine.executors导入DaskExecutor
#看https://docs.prefect.io/api/latest/environments/storage.html#docker
从perfict.environments.storage导入Docker
#选择1
storage=Docker(registry\u url=“gcr.io/my project/”,
python_dependencies=[“一些额外的公共包”],
dockerfile=“/path/to/dockerfile”)
#这是docker构建和注册工作流!
#storage.build()
#或选项2,直接指定图像
仓库=码头工人(
registry\u url=“gcr.io/my project/”,image\u name=“my image”,image\u tag=“latest”
)
#storage.build()
def get_任务():
返回[
“gs://path/to/task.yaml”
]
@长官任务
def run_任务(uri):
#失败,因为需要对此数据进行pickle??
从data.tasks导入TaskBase
task=TaskBase.from_task_uri(uri)
#task.run()
返回“完成”
使用perfict.Flow(“dask示例”,
存储=存储)作为流:
#连锁店。。。
结果=运行任务.map(uri=获取任务()
执行者=DaskExecutor(地址=”tcp://127.0.01:8080")
flow.run(executor=executor)

有人能解释一下这种基于docker的工作流应该如何工作吗?

您的dask工作人员将需要访问与您的任务运行所依赖的相同的python库。实现这一点的最简单方法是使用与流相同的映像运行dask工作程序。您可以手动执行此操作,或者使用类似的方法,在每次流运行时使用相同的映像自动创建短期Dask群集。

谢谢Chris。这是有道理的,我将遵循这条路线。我只是想确保任务不能以这种方式进行容器化,特别是如果我想使用一个预先存在的dask集群作为执行环境的话。我不能投票,但你的回答解决了我的不确定性。