[英]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
實際上,可以動態聲明具有有效模板占位符的卷作為服務聲明的一部分,如下所示:
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 命令行輕松檢索和檢查),但不幸的是它們不能與模板占位符一起使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.