首页 > 解决方案 > 使用 Docker Swarm 模板命名 Dask Worker

问题描述

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

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

...
  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 所有支持的环境变量配置名称的详尽文档,所以可能是一个错字或不正确的猜测。

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

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

在这一点上我没有想法,想知道是否有人能想出办法。

谢谢。

标签: dockerdocker-composedaskdocker-swarmdask-distributed

解决方案


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

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

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


推荐阅读