等效于Docker Compose v3中的volumes_from

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

我有这个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中重写这个?

要回答你的问题 – 它不可能与V3 – 请参阅下面的部分。 第3版不得作为inheritance人(也是docker的官方声明),应在“群体案件”中使用。

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

您可以像这样将它与主机安装卷相结合

 docker volume create --name volume1 -o type=none -o device=/home/$USER/projects/01 -oo=bind 

您可以使用3.2中引入的long-syntax来简化它: https : //docs.docker.com/compose/compose-file/#long-syntax-2,这样您就可以在docker中的主机上定义指定的volume + bind构成文件示例:

 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”语法来创build具有绑定选项的卷,如上所述

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


v3中没有volume_from,因为v3不是v2的后继者,它是一个替代scheme – 请参阅我的评论和源代码https://github.com/rancher/rancher/issues/3316#issuecomment-310889283

综上所述,volume_from和volume在重叠的情况下volume_from在错误的字段中被错误地使用了。

a)如果希望数据在整个堆栈升级过程中保持不变(down + up),则select命名卷 – 现在,如果2+服务需要共享这个卷,则只需使用volumes:挂载该命名卷即可。

b)如果你希望数据在堆栈升级过程中保持不变(例如,因为它的源代码和图像实际上包含了升级),你可以创build一个非常规的应用程序+ httpd / proxy场景对于这个例如/var/www在Dockerfile中使用Volume /var/www ,然后使用volumes_from将其挂载到httpd服务中。


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

尝试对命名卷执行同样的操作,会在第一次升级时给您带来巨大的惊喜,因为代码位于已命名的卷上,并将代码库覆盖在“新鲜”映像/新容器上,因此您将运行在旧代码库升级后。

我得到了docker-compose版本3一起工作。 基本上必须replace“volumes_from”并创build一个全局的“卷”声明。

 version: "3" services: unison: container_name: xxx_unison image: onnimonni/unison environment: - UNISON_DIR=/var/www/$DOCKER_WEB_DOMAIN/htdocs/ - UNISON_USER=www-data - UNISON_UID=1000 - UNISON_GID=1001 volumes: - unison_file:/var/www/$DOCKER_WEB_DOMAIN/htdocs/ networks: - frontend ports: - "5000:5000" database: container_name: xxx_database image: percona depends_on: - unison environment: - MYSQL_ROOT_PASSWORD=xxx - MYSQL_DATABASE=xxx # Assign a database to be created on container first load volumes: - ./mysql/import:/docker-entrypoint-initdb.d - ./mysql/data/:/var/lib/mysql/ - ./logs:/var/log/mysql - ./mysql/conf:/etc/mysql/conf.d ports: - "3306:3306" networks: - frontend web: container_name: xxx_web image: ubuntu depends_on: - unison volumes: - ./nginx/ssl/:/etc/nginx/ssl/ - ./logs/:/var/log/nginx - ./shell/run.sh:/run.sh - unison_file:/var/www/$DOCKER_WEB_DOMAIN/htdocs/ ports: - "80:80" - "443:443" networks: - frontend env_file: - ./.env networks: frontend: volumes: unison_file: