如何使用docker-compose将本地文件夹绑定到多个服务中,而无需每次都重复操作?
如何使用docker-compose将本地文件夹绑定到多个服务中,而无需每次都重复操作?
我有一个docker-compose.yml文件,其中定义了多个服务,每个服务都会生成一个独立的容器。简单来说,它看起来像这样:
version: "3.9"
services:
dev_1:
build:
context: .
dockerfile: ./Dockerfile
target: dev_1
volumes:
- type: bind
source: /home/foo
target: /home/bar
dev_2:
build:
context: .
dockerfile: ./Dockerfile
target: dev_2
volumes:
- type: bind
source: /home/foo
target: /home/bar
你可以看到,对于每个服务,我都必须再次绑定挂载卷,复制相同的代码行。但在我的应用程序中,我有几个这样的文件夹,我想将它们挂载到所有的服务中,但不想一遍又一遍地复制所有的代码行。
有没有办法缩短这个过程,例如使用`volumes`指令?
到目前为止,我只找到了使用共享卷的建议,但对我来说这不实用,因为这样一个卷会将数据复制到卷中。而我有大量的数据(几TB),我不想复制。我只想绑定挂载它们。
docker-compose版本无关紧要 - 目前我正在使用`3.9`。只要它能工作,任何版本都可以。
提前感谢!
问题的出现原因是作者想要在docker-compose中将本地文件夹绑定到多个服务中,而不需要每次都重复定义。解决方法是使用anchors(锚点)、aliases(别名)和x-标记,可以在一个中心服务中定义卷,然后在其他服务中重用。
首先,作者定义了一个common service(共享服务)x-volumes_all
,前缀的x-
表示该服务是隐藏的,只是用于在其他服务中重用。此外,作者使用锚点&
为其提供一个任意名称(&volumes_all
)。在volumes部分,作者简单地定义了绑定挂载,并再次使用锚点为每个卷命名(&vol1
和&vol2
)。
稍后,在service部分,作者通过使用*
对别名进行解引用,导入了隐藏的服务(<<: *volumes_all
)。以相同的方式,作者现在可以通过*
和它们各自的名称再次包含各个卷。
这样,作者只需要定义一次就可以减少错误。
还有一种更简单的方法,即在docker compose中将卷定义为顶级元素,然后它们对所有其他服务都可用。
作者认为这种语法很酷,但在这种情况下并不需要。Docker compose允许将卷定义为顶级元素,然后它们对所有其他服务都可用。
作者提供了一个链接,指向一个关于在Docker Compose文件中使用锚点、别名和扩展的文章,以进一步了解这个解决方法。
,通过使用锚点和别名,可以在docker-compose中定义一个共享的卷服务,然后在其他服务中重复使用这些卷,避免了重复定义的问题。这种方法可以减少错误,并提高代码的可读性和可维护性。