docker - 使用 Docker Swarm 模板命名 Dask Worker
问题描述
我目前正在使用 Docker Swarm 跨集群部署/管理多个 Dask Worker。为了更容易调试,我希望能够根据 Swarm 中运行的节点来命名工作人员。
该dask-worker
命令有一个--name
参数,但是,Docker 的模板似乎在entrypoint
orcmd
选项中不起作用。例如
...
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
...
在这一点上我没有想法,想知道是否有人能想出办法。
谢谢。
解决方案
您可以在服务环境和主机名上使用服务模板变量,如果我的内存服务器正确,则可以在卷声明中使用。
这么说,不service.worker.hostname: "{{.Node.Hostname}}"
就行了吗?此外,如果您在命令中使用空格 $FOO,您的最后一次尝试可能会奏效。如果我没记错的话,您需要在前面加上另一个 $ 符号来转义 $ 符号。因此,不要尝试 $FOO,而是尝试 $$FOO - 否则它将在容器启动期间在主机上应用变量替换,而不是在容器中执行命令时。
如果没有,您仍然可以编写一个小的入口点脚本来包装您的命令并使用您声明的环境变量。
推荐阅读
- php - Generate a last 7 days weekly report in Mysql
- javascript - 如何使用javascript选择或检索excelsheet的单元格数据?
- http - https如何比http更安全?
- reactjs - React Material Table IE 11 问题
- python - PackagesNotFoundError:当前频道无法提供以下软件包:python_cypher==0.14.2,py2neo==4.3.0,ruamel.base==1.0.0
- excel - 如何将新数据合并/导入到具有多个匹配列的 Excel 工作表中
- reactjs - 使用 useState 添加对象时,状态被清空
- ios - iOS 应用程序崩溃 AppleMetalGLRenderer gldReadFramebufferData
- selenium-webdriver - 有没有办法将每个测试用例的 Azure DevOps 测试计划参数作为 Visual Studio 自动化测试的一部分?
- reactjs - 如何在 React 中渲染 PDF