簡體   English   中英

在 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

實際上,可以動態聲明具有有效模板占位符的卷作為服務聲明的一部分,如下所示:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM