问题描述
我目前正在使用Docker Swarm在整个集群中部署/管理多个Dask Worker。为了便于调试,我希望能够根据运行Swarm的节点上的名称来命名工作线程。
dask-worker
命令具有一个--name
参数,但是,Docker的模板似乎在entrypoint
或cmd
选项中不起作用。例如
...
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-否则它将在容器启动过程中在主机上应用变量替换,而在容器中执行命令时不应用变量替换。
如果没有,您仍然可以编写一个小的入口点脚本来包装命令并使用您声明的环境变量。