在 Docker Swarm 中使用模板占位符绑定卷

Use of template placeholders for binding volumes in Docker Swarm

我有一个由 5 个节点组成的群。所有节点都有一个共享文件夹 /data/shared(通过 GlusterFS)。我希望将每个容器的 /conf/data 文件夹挂载到它们相应的共享文件夹中(由它们的插槽号定义)。

version: '3.7'

services:
  hello:
    image: bash
    hostname: "hello-{{.Task.Slot}}"
    volumes:
      - conf-vol:/conf
      - data-vol:/data
    command:
      >
      bash -c "echo ""hostname: $$(hostname)"" > /conf/hello 
      && echo ""hostname: $$(hostname)"" > /data/hello"
     
    deploy:      
      replicas: 5
      restart_policy:
        condition: none

volumes:
  conf-vol:
    driver_opts:
      type: "ext4"
      o: "bind"
      device: "/data/shared/hello/{{.Task.Slot}}/conf"

  data-vol:
    driver_opts:
      type: "ext4"
      o: "bind"
      device: "/data/shared/hello/{{.Task.Slot}}/data"

不幸的是,绑定卷的{{.Task.Slot}}编号似乎与用于创建容器hello-{{.Task.Slot}}(主机名)的编号不对应。

cat /data/shared/hello/1/conf/hello 
hostname: hello-5

cat /data/shared/hello/2/conf/hello 
hostname: hello-2

cat /data/shared/hello/3/conf/hello 
hostname: hello-1

cat /data/shared/hello/4/conf/hello 
hostname: hello-3

cat /data/shared/hello/5/conf/hello 
hostname: hello-4

有没有办法实现正确的绑定?

docker version 
Client: Docker Engine - Community
 Version:           19.03.13
 API version:       1.40

实际上可以声明具有有效 template placeholders 的卷作为服务声明的一部分,如下所示:

version: '3.7'

services:
  hello:
    image: bash
    hostname: "hello-{{.Task.Slot}}"
    volumes:
      - /data/shared/hello/{{.Task.Slot}}/conf:/conf
      - /data/shared/hello/{{.Task.Slot}}/data:/data
    command:
      >
      bash -c "echo ""hostname: $$(hostname)"" > /conf/hello 
      && echo ""hostname: $$(hostname)"" > /data/hello"
     
    deploy:      
      replicas: 5
      restart_policy:
        condition: none

命名卷的优点是它们可以在多个服务中重复使用(并且可以使用 docker 命令行轻松检索和检查)但不幸的是它们不适用于模板占位符。