【问题标题】:Allowing multiple services in docker-compose to share a merged volume允许 docker-compose 中的多个服务共享一个合并的卷
【发布时间】:2018-05-18 17:32:04
【问题描述】:

给定一个像下面这样的docker-compose.yml 文件,我正在寻找一种方法,让服务ab 都可以访问由合并 内容组成的共享卷两个容器。

version: '3'
volumes:
   shared-merged-volume:
services:
   a:
     volumes:
       - shared-merged-volume:/shared
   b:
     volumes:
       - shared-merged-volume:/shared

假设服务a/shared/dir-from-a 有一个目录,而服务b 有一个类似的/shared-dir-from-b 目录。期望的结果是:

$ ls /shared # from either container
dir-from-a
dir-from-b

我发现其中一个容器“获胜”并且这两个目录中只有一个存在。我可以像这样解决这个问题,但更冗长,如果目录内容发生变化,则需要修改:

version: '3'
volumes:
   service-a-shared-volume:
   service-b-shared-volume:
services:
   a:
     volumes:
       - service-a-shared-volume:/shared/dir-from-a
       - service-b-shared-volume:/shared/dir-from-b
   b:
     volumes:
       - service-a-shared-volume:/shared/dir-from-a
       - service-b-shared-volume:/shared/dir-from-b

提前感谢您的帮助!

【问题讨论】:

  • 您找到解决此问题的有效方法了吗?

标签: docker docker-compose


【解决方案1】:

是否需要使用命名卷?

如果不是,那么为了完成这种合并,我通常只是将目录映射到主机驱动器上的一个位置,而不是使用卷,并且合并没有问题。在大负载和同时写入的多个容器上进行了测试。

建议的撰写文件:

version: '3'
volumes:
   shared-merged-volume:
services:
   a:
     volumes:
       - /location/on/host/system:/shared
   b:
     volumes:
       - /location/on/host/system:/shared

从 cmets 编辑

此方法将本地主机目录中的所有内容挂载到/shared,这意味着如果它是空的 - 它将挂载空目录,并且那里的任何内容 - 都将被空目录覆盖。服务启动后将写入该挂载中的所有内容都将按预期在服务之间持久化和合并。

【讨论】:

  • 谢谢!这似乎消除了每个服务上 /shared 的任何现有内容,这不是我想要的。我想要每个容器中每个 /shared 的合并内容
  • 这很奇怪。如果我自己不这样做,它永远不会从该位置删除任何东西。我们应该更深入地调查。你的 docker 和 docker-compose 版本是多少?
  • Docker 版本 18.03.1-ce,构建 9ee9f40 docker-compose 版本 1.21.1,构建 5a3f1a3
  • 好的,显然我有相同的版本。但我想我误解了你,这种方法将本地主机目录中的所有内容挂载到/shared,这意味着如果它是空的 - 它会挂载空目录,并且在服务启动后将在该挂载中写入的任何内容都将是跨服务持久化和合并。
  • 是的,这不是我想要的!每个容器在/shared 中都有自己的一组文件,我希望它们在所有容器之间共享。无论如何感谢您的参与:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-08
  • 1970-01-01
  • 1970-01-01
  • 2017-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多