【发布时间】: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 的默认值),你可以通过
Dockerstorage 上的image_name和image_tagkwargs 来完成
标签: docker etl dask docker-image prefect