如何在 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
几分钟。
我不明白为什么它推了一个图像然后拉了它?相反,我已经在此注册表上构建了一个图像,我想指定一个应该用于任务执行的图像。
我最终实现的方法如下:
- 运行
prefect server start
在服务器上(即不在 docker 内)。
docker 中的 docker-compose 显然不是一个好主意。
- 运行
prefect agent start
在 docker 图片里面
- 确保流可由 docker 图像访问(即通过在图像和服务器之间安装共享卷以获取
示例)
你可以看到我回答的来源here。
我的目标:
我有一个内置的 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
几分钟。
我不明白为什么它推了一个图像然后拉了它?相反,我已经在此注册表上构建了一个图像,我想指定一个应该用于任务执行的图像。
我最终实现的方法如下:
- 运行
prefect server start
在服务器上(即不在 docker 内)。 docker 中的 docker-compose 显然不是一个好主意。 - 运行
prefect agent start
在 docker 图片里面 - 确保流可由 docker 图像访问(即通过在图像和服务器之间安装共享卷以获取 示例)
你可以看到我回答的来源here。