如何解决使用模板占位符绑定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 命令行轻松检索和检查),但不幸的是它们不能与模板占位符一起使用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。