相当于Docker Compose v3中的volumes_from

Bor*_*ard 17 docker docker-compose

这里似乎有类似的问题(docker-compose volumes_from等同于版本3,如何替换docker-composer v3中的volumes_from)但我不认为他们回答了这个问题(或者至少我不明白答案如何解决问题).所以让我再试一次,非常具体.

我有这个v2 docker-compose.yml:

version: '2'
services:
  full-tests:
    volumes:
      - ..:/opt/project
      - ../../../ext-libs:/opt/ext-libs
      - ./third-mapping:/opt/third

  unit-tests:
    volumes_from: full-tests
Run Code Online (Sandbox Code Playgroud)

关键是卷的集合定义一次,我可以轻松地重用它们volumes_from.

你会如何在v3中重写这个?

Eug*_*yer 12

要回答你的问题 - v3不可能 - 请参阅下面的部分.v3不得用作后继者(也是码头工人的正式声明),应在"群体案件"中使用.

不过,你应该做的是使用命名卷.

您可以将它与这样的主机安装卷组合

docker volume create --name volume1 -o type=none -o device=/home/$USER/projects/01 -o o=bind
Run Code Online (Sandbox Code Playgroud)

您可以使用3.2中引入的长语法简化此操作:https://docs.docker.com/compose/compose-file/#long-syntax-2,这样您就可以在docker中的主机上定义命名卷+绑定-compose文件示例:

services:
   full-tests:
    volumes:     
      - type: volume
        source: ../
        target: /opt/project
      - type: volume
        source: ../../../ext-libs
        target: /opt/ext-libs
Run Code Online (Sandbox Code Playgroud)

或者简而言之

services:
   full-tests:
     volumes:     
      - ../:/opt/project
      - ../../../ext-libs:/opt/ext-libs
Run Code Online (Sandbox Code Playgroud)

但你不能做什么,将长语法放在顶级"卷"定义下,为该卷命名并在服务的卷部分重用它 - 这是不可能的.为此,您将使用

volumes:
  project:
    external: true
  third-party:
    external: true
Run Code Online (Sandbox Code Playgroud)

然后使用cli上的"docker volume create"语法创建带有绑定选项的卷,如上所述

但是你永远不会得到volume_from在这里为你做的事情


在v3中没有相应的volumes_from,因为v3不是v2的后继者,它是另一种选择 - 请参阅我的评论和来源https://github.com/rancher/rancher/issues/3316#issuecomment-310889283

总结一下 - 如果在错误的字段中使用了错误的方式,则volume_from和卷有重叠的情况.

a)如果您希望堆栈升级(向下+向上)保持数据,则选择命名卷 - 现在,如果需要共享2个以上的服务,则只需使用安装此命名卷volumes:.

b)如果您希望数据在堆栈升级中持续存在(例如,因为其源代码和图像实际上包括升级),作为通常的应用程序+ httpd /代理方案,您将创建一个匿名卷为此,例如/var/www在Dockerfile中使用Volume /var/www,然后使用volumes_from将其挂载到httpd服务中.


b的要点是,在堆栈升级时,将删除anon卷(`docker-compose down删除anon容器,但不删除命名容器)因此升级按预期工作,你有一个新的代码库

尝试对命名卷执行相同操作会让您在第一次升级时感到非常惊讶,因为代码位于命名卷上并且会将代码库覆盖在"新鲜"映像/新容器上,因此您将在旧版本上运行升级后的代码库.