
我有这个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
关键是卷的集合定义一次,我可以使用volumes_from轻松地重用它们.
你会如何在v3中重写这个?
不过,你应该做的是使用命名卷.
您可以将它与这样的主机安装卷组合
docker volume create --name volume1 -o type=none -o device=/home/$USER/projects/01 -o o=bind
您可以使用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
或者简而言之
services:
full-tests:
volumes:
- ../:/opt/project
- ../../../ext-libs:/opt/ext-libs
但你不能做什么,将长语法放在顶级“卷”定义下,为该卷命名并在服务的卷部分重用它 – 这是不可能的.为此,您将使用
volumes:
project:
external: true
third-party:
external: true
然后使用cli上的“docker volume create”语法创建带有绑定选项的卷,如上所述
但是你永远不会得到volume_from在这里为你做的事情
在v3中没有相应的volumes_from,因为v3不是v2的后继者,它是另一种选择 – 请参阅我的评论和来源https://github.com/rancher/rancher/issues/3316#issuecomment-310889283
总结一下 – 如果在错误的字段中使用了错误的方式,则volume_from和卷有重叠的情况.
a)如果希望数据在堆栈升级(向下)之间保持不变,则选择命名卷 – 现在,如果需要共享2个服务,则只需使用卷安装此命名卷:
b)如果您不希望数据在堆栈升级中持续存在(例如,因为其源代码和图像实际上包括升级),作为在通常的应用程序httpd / proxy场景中,您将创建一个非卷 – 这个例如使用Volume / var / www在Dockerfile中使用/ var / www,然后使用volumes_from将其挂载到httpd服务中.
b的要点是,在堆栈升级时,将删除anon卷(`docker-compose down删除anon容器,但不删除命名容器)因此升级按预期工作,你有一个新的代码库
尝试对命名卷执行相同操作会让您在第一次升级时感到非常惊讶,因为代码位于命名卷上并且会将代码库覆盖在“新鲜”映像/新容器上,因此您将在旧版本上运行升级后的代码库.
转载注明原文:相当于Docker Compose v3中的volumes_from - 乐贴网