【问题标题】:docker-compose v3: sharing bind-mounted volume between multiple containers with top-level volumes syntaxdocker-compose v3:使用顶级卷语法在多个容器之间共享绑定安装的卷
【发布时间】:2017-12-03 03:11:29
【问题描述】:

使用 docker-compose synthax 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 现在是 invalid option。该文档全部用于使用新的顶级卷合成器,即all the ways better。 我在github上读过一些cmets,人们提出的唯一解决方案是

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 而不是顶级卷,但它被视为文档中的遗留选项。那么如何正确使用新语法呢?

编辑: 问题已被确定为可能重复,但我不同意。请参阅下面的评论以获取解释。

【问题讨论】:

  • @panK 我在询问原生 docker 方式来做我能够用 v2 合成器实现的事情。如果需要第三方插件来达到同样的效果,那么答案可能是:不可能。但我不确定实际情况是否如此,因为从我在 github repo 上看到的内容来看,建议的插件没有得到积极维护,也不是很受欢迎。同时,这是很常见的用例。因此,我假设该问题的作者正在寻找任何可能的选择,并且我正在寻找本地的“官方” docker 方式。
  • 我将其标记为可能重复,因为那天我浏览了许多与“volumes_from”相关的帖子,我相信每个人都在寻找原生、官方和可靠的解决方案。我找不到任何官方的,因为看起来他们只是放弃了这个想法。这是我坚持使用 v2 语法的唯一原因。
  • @panK 好吧,那么你可以在下面发布一个答案,提出一些论点,如果真的“不可能”,那么我会接受这个作为回答。

标签: docker docker-compose docker-volume


【解决方案1】:

正如主题开始者已经提到的,volumes_from 已从新的 docker-compose 语法中删除,根据 documentation 支持在顶级键 volumes 中定义的命名卷。该文档还说明了volumesbind mounts 之间的区别,其中之一是谁管理内容:

相比之下,当您使用卷时,会在主机上 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

【讨论】:

  • 问题中包含“分享”一词,不重复。在旧版本中可以共享。重复总是不好的做法。
  • 对于编程语言,重复是一种不好的做法,我同意。这是一个配置文件,明确可以帮助消除任何歧义。顺便说一句,如果您将我使用 3.2 语​​法的解决方案与使用 docker inspect 的 2.0 语法进行比较,您会看到两个版本在后台几乎相同,并且您会看到相同的挂载是“共享”的容器。
猜你喜欢
  • 2017-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-28
  • 2021-02-21
  • 1970-01-01
相关资源
最近更新 更多