扩展你的Compose文件
Docker Compose的
extends 属性
允许你在不同的文件之间共享通用配置,甚至可以在完全不同的项目之间共享。
如果您有多个服务重用一组共同的配置选项,扩展服务非常有用。使用extends,您可以在一个地方定义一组共同的服务选项,并从任何地方引用它。您可以引用另一个Compose文件,并选择您希望在自己的应用程序中使用的服务,同时能够根据您的需求覆盖某些属性。
重要
当你使用多个Compose文件时,你必须确保文件中的所有路径都是相对于基础Compose文件的(即主项目文件夹中的Compose文件)。这是必需的,因为扩展文件不必是有效的Compose文件。扩展文件可以包含配置的小片段。跟踪服务的哪个片段相对于哪个路径是困难且令人困惑的,因此为了使路径更容易理解,所有路径必须相对于基础文件定义。
工作原理
从另一个文件扩展服务
以下是一个例子:
services:
web:
extends:
file: common-services.yml
service: webapp这指示Compose仅重用webapp服务的属性
定义在common-services.yml文件中。webapp服务本身不是最终项目的一部分。
如果 common-services.yml 看起来像这样:
services:
webapp:
build: .
ports:
- "8000:8000"
volumes:
- "/data"你会得到完全相同的结果,就像你直接写在docker-compose.yml中的build、ports和volumes配置值一样,这些值直接定义在web下。
要在从另一个文件扩展服务时将服务webapp包含在最终项目中,您需要明确地在当前的Compose文件中包含这两个服务。例如(请注意这是一个非规范性示例):
services:
web:
build: alpine
command: echo
extends:
file: common-services.yml
service: webapp
webapp:
extends:
file: common-services.yml
service: webapp或者,你可以使用 include.
在同一文件中扩展服务
如果您在同一个Compose文件中定义服务并从另一个服务扩展一个服务,原始服务和扩展服务都将成为您最终配置的一部分。例如:
services:
web:
build: alpine
extends: webapp
webapp:
environment:
- DEBUG=1在同一文件和从另一个文件中扩展服务
你可以进一步在compose.yaml中本地定义或重新定义配置:
services:
web:
extends:
file: common-services.yml
service: webapp
environment:
- DEBUG=1
cpu_shares: 5
important_web:
extends: web
cpu_shares: 10附加示例
当你有多个服务具有共同配置时,扩展单个服务非常有用。下面的示例是一个包含两个服务的Compose应用程序,一个Web应用程序和一个队列工作者。这两个服务使用相同的代码库并共享许多配置选项。
common.yaml 文件定义了通用配置:
services:
app:
build: .
environment:
CONFIG_FILE_PATH: /code/config
API_KEY: xxxyyy
cpu_shares: 5docker-compose.yaml 定义了使用通用配置的具体服务:
services:
webapp:
extends:
file: common.yaml
service: app
command: /code/run_web_app
ports:
- 8080:8080
depends_on:
- queue
- db
queue_worker:
extends:
file: common.yaml
service: app
command: /code/run_worker
depends_on:
- queue异常和限制
volumes_from 和 depends_on 在使用 extends 的服务之间永远不会共享。这些例外存在是为了避免隐式依赖;你总是在本地定义 volumes_from。这确保了在阅读当前文件时,服务之间的依赖关系清晰可见。在本地定义这些也确保了对引用文件的更改不会破坏任何内容。
extends 在你只需要共享一个服务并且你熟悉你正在扩展的文件时非常有用,这样你可以调整配置。但是,当你想重用别人不熟悉的配置并且你不知道它自己的依赖关系时,这不是一个可接受的解决方案。
相对路径
当使用带有指向另一个文件夹的file属性的extends时,被扩展服务声明的相对路径会被转换,以便在扩展服务中使用时仍然指向相同的文件。以下示例说明了这一点:
基础Compose文件:
services:
webapp:
image: example
extends:
file: ../commons/compose.yaml
service: basecommons/compose.yaml 文件:
services:
base:
env_file: ./container.env生成的服务引用了commons目录中的原始container.env文件。这可以通过docker compose config来确认,该命令会检查实际模型:
services:
webapp:
image: example
env_file:
- ../commons/container.env