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

m0o*_*ell 10 docker docker-compose docker-volume

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

volumes_from现在是v3.2 invalid option.该文档仅用于使用新的顶级卷synthax,即all the ways better.我已经阅读了一些关于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
Run Code Online (Sandbox Code Playgroud)

这显然看起来更糟,它甚至对我不起作用.它给了我一个错误:no such file or directory.那么我还应该尝试什么呢?看起来我仍然可以使用links而不是顶级卷,但它被认为是文档中的遗留选项.那么如何使用新语法做到这一点?

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

Bar*_*ten 3

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

\n\n
\n

相比之下,当您使用卷时,会在主机上的 Docker\xe2\x80\x99s 存储目录中创建一个新目录,并且 Docker 管理该目录\xe2\x80\x99s 的内容。

\n
\n\n

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

\n\n

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

\n\n
version: \'3.2\'\nservices:\n  nginx:\n    image: nginx\n    volumes:\n      - type: bind\n        source: ../app\n        target: /var/www/app\n  php:\n    image: php\n    volumes:\n      - type: bind\n        source: ../app\n        target: /var/www/app\n
Run Code Online (Sandbox Code Playgroud)\n

  • 问题中有“分享”二字,不重复。在旧版本中可以共享。重复总是不好的做法。 (8认同)
  • 我同意,对于编程语言来说,重复是一种不好的做法。这是一个配置文件,其中明确的内容可以帮助消除任何歧义。顺便说一句,如果您将我的解决方案与 3.2 语​​法和 2.0 语法的 docker Inspect 进行比较,您会发现在幕后这两个版本几乎相同,并且您会看到相同的安装在两者之间“共享”容器。 (3认同)