在 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 命令行轻松检索和检查)但不幸的是它们不适用于模板占位符。
我有一个由 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 命令行轻松检索和检查)但不幸的是它们不适用于模板占位符。