【问题标题】:Naming Dask Worker with Docker Swarm Templating使用 Docker Swarm 模板命名 Dask Worker
【发布时间】:2020-09-14 14:39:44
【问题描述】:

我目前正在使用 Docker Swarm 跨集群部署/管理多个 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
...

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

谢谢。

【问题讨论】:

    标签: docker docker-compose dask docker-swarm dask-distributed


    【解决方案1】:

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

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

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

    【讨论】:

    • 我使用了 $$ 转义选项。我不知道这一点,但它似乎奏效了。谢谢。我的入口点最终看起来像entrypoint: ["sh", "-c", "echo $$FOO"]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-30
    相关资源
    最近更新 更多