使用Docker Swarm模板命名Dask Worker

问题描述

我目前正在使用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
...

我现在还没有主意,想知道是否有人可以找到一种方法。

谢谢。

解决方法

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

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

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...