允许 docker-compose 中的多个服务共享合并的卷

jay*_*ayp 6 docker docker-compose

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

version: '3'
volumes:
   shared-merged-volume:
services:
   a:
     volumes:
       - shared-merged-volume:/shared
   b:
     volumes:
       - shared-merged-volume:/shared
Run Code Online (Sandbox Code Playgroud)

假设 servicea有一个目录 at/shared/dir-from-a并且 serviceb有一个类似的/shared-dir-from-b目录。想要的结果是:

$ ls /shared # from either container
dir-from-a
dir-from-b
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的帮助!

tru*_*512 0

是否需要使用命名卷?

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

建议的撰写文件:

version: '3'
volumes:
   shared-merged-volume:
services:
   a:
     volumes:
       - /location/on/host/system:/shared
   b:
     volumes:
       - /location/on/host/system:/shared
Run Code Online (Sandbox Code Playgroud)

根据评论编辑

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