Docker-Compose v3:使用顶级卷语法在多个容器之间共享绑定挂载卷。

16

使用Docker Compose 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中,volumes_from现在是无效选项。文档都是使用新的顶层卷语法,这种语法更好的方式
我在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

很明显看起来很糟糕,而且对我也没用。它给了我一个错误:no such file or directory。那么我还应该尝试什么?看起来我仍然可以使用links而不是顶级卷,但在文档中被视为传统选项。那么如何使用新语法正确实现?

编辑: 这个问题已经被确认为可能是重复的,但我不同意。请参见下面的评论说明。


可能是如何在docker-composer v3中替换volumes_from的重复问题。 - panK
2
@panK 我问的是使用本机 Docker 实现我可以用 v2 synthax 实现的功能。如果需要第三方插件来实现相同的效果,那么答案可能是:不可能。但我并不确定实际情况是否如此,因为从 GitHub 存储库中可以看到,建议使用的插件并没有得到积极维护,并且并不是非常受欢迎。与此同时,这是相当普遍的使用情况。因此,我假设该问题的作者正在寻找任何可能的选项,而我正在寻找本地的“官方”Docker方式。 - m0onspell
我将其标记为可能的重复,因为那天我浏览了许多与“volumes_from”相关的帖子,我相信每个人都在寻找本地、官方和可靠的解决方案。我找不到任何官方的解决方案,因为看起来他们已经放弃了这样的想法。这就是我坚持使用v2语法的唯一原因。 - panK
@panK好的,那么你可以在下面发布一个答案,提出一些论据,如果真的“不可能”,那么我会接受这个答案。 - m0onspell
1个回答

3
正如主题发起者所提到的,根据文档volumes_from已从新的docker-compose语法中删除,而采用顶级键volumes中定义的命名卷。文档还说明了绑定挂载之间的区别,其中一个区别是谁管理内容:

相比之下,当您使用卷时,在主机上创建一个新目录,并且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

7
问题中包含“分享”一词,而不是重复。 在早期版本中可以进行共享。 重复始终是不良做法。 - m0onspell
3
对于编程语言来说,重复是一种不好的做法,我同意。这是一个配置文件,在其中明确表达可以帮助消除任何歧义。顺便说一句,如果你将我的解决方案与使用docker inspect的3.2语法和2.0语法进行比较,你会发现两个版本在底层几乎完全相同,并且你会发现同一个挂载在容器之间是“共享”的。 - Bart Joosten
这个语法对我不起作用。我得到了一个 service "whatever" refers to undefined volume whatever_volume: invalid compose project 的错误。 另一方面,OP建议的带有volumes:部分的语法确实有效。 - cassepipe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接