如何在Docker映像上执行Prefect Flow?

问题描述

我的目标:

我有一个内置的docker映像,并希望在该映像上运行我的所有Flows。

当前:

我有以下任务在本地dask执行器上运行。 运行代理程序的服务器与执行my_task所需的服务器环境不同,因此需要在预构建映像中运行。

我的问题是: 我如何在dask执行器上运行此Flow,以使其在我提供的docker映像上(作为环境)运行?

import prefect
from prefect import task,Flow
from prefect.engine.executors import LocaldaskExecutor
from prefect.environments import LocalEnvironment


@task
def hello_task():
    logger = prefect.context.get("logger")
    logger.info("Hello,Docker!")


with Flow("My Flow") as flow:
    results = hello_task()

flow.environment = LocalEnvironment(
    labels=[],executor=LocaldaskExecutor(scheduler="threads",num_workers=2),)

我认为我需要首先在该docker映像上启动服务器和代理(如here所述),但是我想有一种方法可以在提供的映像上简单地运行Flow。

更新1

this教程之后,我尝试了以下操作:

import prefect
from prefect import task,Flow
from prefect.engine.executors import LocaldaskExecutor
from prefect.environments import LocalEnvironment
from prefect.environments.storage import Docker


@task
def hello_task():
    logger = prefect.context.get("logger")
    logger.info("Hello,Docker!")


with Flow("My Flow") as flow:
    results = hello_task()

flow.storage = Docker(registry_url='registry.gitlab.com/my-repo/image-library')
flow.environment = LocalEnvironment(
    labels=[],)

flow.register(project_name="testing")

但这会创建一张图片,然后将其上传到提供的registry_url。然后,当我尝试运行已注册的任务时,它拉出了新创建的映像,并且该任务现在停留在状态Submitted for execution中了几分钟。

我不明白为什么它先推图像然后拉图像?取而代之的是,我已经在该注册表上构建了一个映像,我想指定一个应该用于任务执行的映像。

解决方法

我最终实现这一目标的方法如下:

  1. 在服务器上运行prefect server start(即不在docker内部)。 显然,在docker中使用docker-compose不是一个好主意。
  2. 在docker映像中运行prefect agent start
  3. 确保docker映像可访问这些流(例如,通过在映像和服务器之间安装共享卷以用于 例子)

您可以看到我的答案here的来源。