【问题标题】:How to execute a prefect Flow on a docker image?如何在 Docker 映像上执行完美流程?
【发布时间】:2021-01-22 14:11:55
【问题描述】:

我的目标:

我有一个已构建的 docker 映像,并希望在该映像上运行我的所有流程。

目前:

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

我的问题是: 如何在 Dask Executor 上运行此流程,以便它在我提供的 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 几分钟。

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

【问题讨论】:

  • 文档对此进行了详细解释,例如,here is a short tutorial。如果您自己运行 Prefect Server,则需要确保 Docker 容器可以通过网络访问您的 Server API。
  • 我读过这个,但它提到registry_url 用于推送到注册表(我觉得这很混乱)。 “如果您确实指定了注册表 URL,那么图像将在流注册时被推送到容器注册表。” registry_url 本质上是我图片的网址(我想运行的那个)吗?
  • Docker 镜像通常存储在Docker registries - 如果您不提供registry_url,则构建的镜像将本地保存在构建它的机器上。
  • 是的,我在注册表中有我的图像(在我的例子中是 GitLab)。为什么我需要提供注册表链接而不是特定的图片链接?
  • 因为镜像还没有建好;如果你想同时指定图像名称和标签(而不是使用 Prefect 的默认值),你可以通过 Docker storage 上的 image_nameimage_tag kwargs 来完成

标签: docker etl dask docker-image prefect


【解决方案1】:

我最终实现的方式如下:

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

你可以看到我的答案出处here

【讨论】:

    猜你喜欢
    • 2021-08-26
    • 1970-01-01
    • 2021-04-19
    • 2022-08-10
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    • 2021-09-15
    • 2014-08-15
    相关资源
    最近更新 更多