docker compose v3:使用顶级卷语法在多个容器之间共享绑定装载的卷

docker compose v3:使用顶级卷语法在多个容器之间共享绑定装载的卷,docker,docker-compose,docker-volume,Docker,Docker Compose,Docker Volume,有了docker compose Syntax的v2,我们可以做如下事情: version: '2' services: app: image: tianon/true volumes: - ../app:/var/www/app nginx: image: nginx volumes_from: - app php: image: php volumes_from: - app 在v3.2卷中中的

有了docker compose Syntax的v2,我们可以做如下事情:

version: '2'
services:
  app:
    image: tianon/true
    volumes:
      - ../app:/var/www/app
  nginx:
    image: nginx
    volumes_from:
      - app
  php:
    image: php
    volumes_from:
      - app
在v3.2
卷中
中的\u现在是
无效选项
。本文档全部用于使用新的顶级卷synthax,它在所有方面都比synthax更好。 我读了一些关于github的评论,人们提出的唯一解决方案是

version: '3.2'
services:
  nginx:
    image: nginx
    volumes:
      - app:/var/www/app
  php:
    image: php
    volumes:
      - app:/var/www/app
volumes:
  app:
    driver_opts:
      type: none
      device: ../app
      o: bind
很明显,这看起来更糟,甚至对我都不起作用。它给了我一个错误:
没有这样的文件或目录
。那么我还应该尝试什么呢?似乎我仍然可以使用
链接
而不是顶级卷,但在文档中它被视为遗留选项。那么,如何使用新的语法正确地执行它呢

编辑:
这个问题被认为可能是重复的,但我不同意。请参阅下面我的评论以了解解释。

正如主题初学者已经提到的,根据顶级键
volumes
中定义的赞成命名卷,已从新的
docker compose
语法中删除了
volumes\u。文档还说明了和之间的区别,其中之一是谁管理内容:

相反,使用卷时,会在主机上Docker的存储目录中创建一个新目录,Docker管理该目录的内容

如果是这种情况,那么将主机文件夹绑定到卷中并让它同时由主机的文件系统和Docker控制是没有意义的

如果仍要将同一文件夹绑定到两个或多个容器中,可以尝试以下操作:

version: '3.2'
services:
  nginx:
    image: nginx
    volumes:
      - type: bind
        source: ../app
        target: /var/www/app
  php:
    image: php
    volumes:
      - type: bind
        source: ../app
        target: /var/www/app

可能是@panK的重复,我在问关于原生docker的方法,我用v2 synthax实现了这一点。如果需要第三方插件来实现同样的效果,那么答案可能是:这是不可能的。但我不确定事实是否如此,因为从我在github repo上看到的情况来看,建议的插件没有得到积极维护,也不是很受欢迎。同时,这也是非常常见的用例。因此,我假设这个问题的作者正在寻找任何可能的选择,我正在寻找本地的“官方”docker方式。我将其标记为可能的副本,因为我浏览了许多与“volumes_from”相关的帖子,我相信每个人都在寻找本地的、官方的、可靠的解决方案。我找不到任何官方的,因为看起来他们放弃了这样的想法。这是我坚持使用v2语法的唯一原因。@panK好吧,然后你可以在下面发布一个答案,提出一些论点,如果真的“不可能”,那么我会接受这个答案。这个问题包含“共享”一词,而不是重复。在旧版本中,共享是可能的。重复总是一种不好的做法。对于编程语言来说,重复是一种不好的做法,我同意。这是一个配置文件,在该文件中,显式有助于消除任何歧义。顺便说一下,如果您将我的解决方案与docker inspect的3.2语法和2.0语法进行比较,您会发现这两个版本几乎完全相同,并且您会看到相同的装载在容器之间“共享”。