在 dask 中,运行 本身 运行 是一个 docker 容器的任务的最简单方法是什么?

In dask, what is the easiest way to run a task that itself runs a docker container?

以下代码将一个函数映射到一个可迭代对象上。应用于每个元素的函数运行一个 docker 容器以计算其 return 值:

import subprocess

def task(arg):
    return subprocess.check_output(
        ["docker", "run", "ubuntu", "bash", "-c", f"echo 'result_{arg}'"]
    )

args = [1, 2, 3]
for result in map(task, args):
    print(result.decode("utf-8").strip())
result_1
result_2
result_3

在 dask 中通过云计算资源并行计算此计算的最简单方法是什么?

例如,如果有人能做类似下面的事情就好了。但这当然行不通,因为执行 python 代码的 Fargate 上的 docker 容器是 运行 默认的 dask 图像,因此无法生成docker 容器本身(我不确定在"docker-in-docker" 方向上是否有解决方案):

import subprocess

from dask.distributed import Client
from dask_cloudprovider import FargateCluster
import dask.bag

def task(arg):
    return subprocess.check_output(
        ["docker", "run", "ubuntu", "bash", "-c", f"echo 'result_{arg}'"]
    )

cluster = FargateCluster(n_workers=1)
client = Client(cluster)
args = [1, 2, 3]
for result in dask.bag.from_sequence(args).map(task).compute():
    print(result)

我正在寻找不涉及在同一 docker 图像中放置不相关代码的解决方案。 IE。我希望我的任务用于其计算的 docker 图像是一个任意的第三方图像,我不必通过添加 python/dask 依赖项来改变它。所以我认为这排除了基于更改 dask_cloudprovider.FargateCluster/ECSCluster 下的工作节点使用的图像的解决方案,因为这将必须容纳 python/dask 依赖项。

将容器拉到 kubernetes 节点上会产生很大的开销,只有在任务很长 运行(分钟、小时)时才真正合理。 dask 面向基于 python 的低开销任务。

在我看来,dask 不是执行容器映像任务的正确工具。还有其他几种技术可以更好地支持基于容器的执行 tasks/workflows(例如 Airflow 的 KubernetesExecutor 或 Argo Workflows)。

您可能会考虑在基于容器的任务中使用 dask_kubernetes 来启动临时集群,以执行所需的计算工作。