相当于Docker Compose v3中的volumes_from
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了相当于Docker Compose v3中的volumes_from相关的知识,希望对你有一定的参考价值。
这里似乎有类似的问题(docker-compose volumes_from equivalent with version 3,How to replace volumes_from in docker-composer v3),但我不认为他们回答了这个问题(或者至少我不明白答案如何解决问题)。所以让我再试一次,非常具体。
我有这个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不可能 - 请参阅下面的部分。 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个以上的服务,只需使用volumes:
挂载此命名卷。
b)如果您不希望数据在堆栈升级中持续存在(例如,因为其源代码和图像实际上包括升级),作为通常的应用程序+ httpd /代理方案,您将创建一个匿名卷为此例如使用/var/www
在Dockerfile中使用Volume /var/www
,然后使用volumes_from将其挂载到httpd
服务中。
b的要点是,在堆栈升级时,将删除anon卷(`docker-compose down删除anon容器,但不删除命名容器)因此升级按预期工作,你有一个新的代码库
尝试对命名卷执行相同操作会让您在第一次升级时感到非常惊讶,因为代码位于命名卷上并且会将代码库覆盖在“新鲜”映像/新容器上,因此您将在旧版本上运行升级后的代码库。
您可以使用extension fields来保持代码简短,但它与volumes_from
不完全相同。例如:
version: '3.7'
x-volumes:
&my-volumes
- ..:/opt/project
- ../../../ext-libs:/opt/ext-libs
- ./third-mapping:/opt/third
services:
full-tests:
volumes:
*my-volumes
unit-tests:
volumes:
*my-volumes
我让docker-compose版本3与unison一起工作。基本上必须替换“volumes_from”并创建全局“卷”声明。
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:
以上是关于相当于Docker Compose v3中的volumes_from的主要内容,如果未能解决你的问题,请参考以下文章
Docker compose v3版本构建跨主机容器编排构建wordpress集群
Docker compose v3版本构建跨主机容器编排构建wordpress集群