问题描述
我的目标:
我有一个内置的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
中了几分钟。
我不明白为什么它先推图像然后拉图像?取而代之的是,我已经在该注册表上构建了一个映像,我想指定一个应该用于任务执行的映像。
解决方法
我最终实现这一目标的方法如下:
- 在服务器上运行
prefect server start
(即不在docker内部)。 显然,在docker中使用docker-compose不是一个好主意。 - 在docker映像中运行
prefect agent start
- 确保docker映像可访问这些流(例如,通过在映像和服务器之间安装共享卷以用于 例子)
您可以看到我的答案here的来源。