使用 Docker Swarm 模板命名 Dask Worker

Naming Dask Worker with Docker Swarm Templating

我目前正在使用 Docker Swarm 来跨集群 deploy/manage 多个 Dask Worker。为了更容易调试,我希望能够根据 Swarm 中 运行 所在的节点来命名工作人员。

dask-worker 命令有一个 --name 参数,但是,Docker 的模板似乎在 entrypointcmd 中不起作用选项。例如

...
  worker:
    image: myapp:latest
    restart: always
    entrypoint: ["dask-worker", "tcp://scheduler:8786", "--name", "{{.Node.Hostname}}"]
    deploy:
      mode: global
...

不幸的是,{{.Node.Hostname}} 模板似乎只在 docker-compose.yml 文件的环境部分有效。所以我的下一个选择是尝试通过这样的环境变量来设置它:

...
  worker:
    image: myapp:latest
    restart: always
    entrypoint: ["dask-worker", "tcp://scheduler:8786"]
    environment:
      DASK_DISTRIBUTED__WORKER__NAME: "{{.Node.Hostname}}"
    deploy:
      mode: global
...

我也没有成功,因为我假设无法通过环境变量设置工作人员名称 - 尽管我无法找到 dask 所有受支持的环境变量配置名称的详尽文档,所以可能是打字错误或猜测不正确。

最后,我尝试获取环境变量并通过 bash 模板将其带回 entrypoint 命令。这也不起作用,因为在评估此命令时似乎未设置环境变量:

...
  worker:
    image: myapp:latest
    restart: always
    entrypoint: ["sh", "-c", "dask-worker tcp://scheduler:8786 --name $FOO"]
    environment:
      FOO: "{{.Node.Hostname}}"
    deploy:
      mode: global
...

我现在没主意了,想知道是否有人能想出办法。

谢谢。

您可以在服务环境和主机名上使用服务模板变量,如果我的内存服务器正确,则可以在卷声明中使用。

这么说,service.worker.hostname: "{{.Node.Hostname}}"不就可以了吗?此外,如果您在命令中使用空格 $FOO ,您的最后一次尝试可能会奏效。如果我没记错的话,你需要在前面加上另一个 $ 符号来转义 $ 符号。因此,请尝试使用 $$FOO 而不是 $FOO - 否则它将在容器启动期间在主机上应用变量替换,而不是在容器中执行命令时应用变量替换。

如果没有,您仍然可以编写一个小的入口点脚本来包装您的命令并使用您声明的环境变量。