如何在 docker 图像上执行完美流程?

How to execute a prefect Flow on a docker image?

我的目标:

我有一个内置的 docker 图像,想 运行 我所有的流都在该图像上。

目前:

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

我的问题是: 我如何运行 Dask Executor 上的这个 Flow 使得它 运行s 在 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=[], executor=LocalDaskExecutor(scheduler="threads", num_workers=2),
)

flow.register(project_name="testing")

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

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

我最终实现的方法如下:

  1. 运行 prefect server start 在服务器上(即不在 docker 内)。 docker 中的 docker-compose 显然不是一个好主意。
  2. 运行 prefect agent start 在 docker 图片里面
  3. 确保流可由 docker 图像访问(即通过在图像和服务器之间安装共享卷以获取 示例)

你可以看到我回答的来源here