如何使用docker-compose将本地文件夹绑定到多个服务中,而无需每次都重复操作?

12 浏览
0 Comments

如何使用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`。只要它能工作,任何版本都可以。

提前感谢!

0
0 Comments

问题的出现原因是作者想要在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中定义一个共享的卷服务,然后在其他服务中重复使用这些卷,避免了重复定义的问题。这种方法可以减少错误,并提高代码的可读性和可维护性。

0