扩展您的 Compose 文件
Docker Compose 的 extends
属性 允许您在不同文件甚至不同项目之间共享通用配置。
如果您有多个服务重用一组通用配置选项,扩展服务非常有用。使用 extends
,您可以在一个地方定义一组通用的服务选项,并在任何地方引用它。您可以引用另一个 Compose 文件并选择要在您自己的应用程序中使用的服务,并能够根据您自己的需要覆盖一些属性。
重要提示
当您使用多个 Compose 文件时,必须确保文件中的所有路径都相对于基础 Compose 文件(即,位于您的主项目文件夹中的 Compose 文件)。这是必需的,因为扩展文件不必是有效的 Compose 文件。扩展文件可以包含少量配置片段。跟踪服务的哪个片段相对于哪个路径是很困难和令人困惑的,因此为了使路径更容易理解,所有路径都必须相对于基础文件定义。
工作原理
从另一个文件扩展服务
以下是示例
services:
web:
extends:
file: common-services.yml
service: webapp
这指示 Compose 仅重用在 common-services.yml
文件中定义的 webapp
服务属性。webapp
服务本身不是最终项目的一部分。
如果 common-services.yml
如下所示
services:
webapp:
build: .
ports:
- "8000:8000"
volumes:
- "/data"
您将获得与在 compose.yaml
中直接在 web
下定义相同的 build
、ports
和 volumes
配置值完全相同的结果。
从另一个文件扩展服务时,若要将 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: 5
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
例外和限制
使用 extends
时,volumes_from
和 depends_on
从不共享。存在这些例外是为了避免隐式依赖;您始终在本地定义 volumes_from
。这确保了在读取当前文件时服务之间的依赖关系清晰可见。在本地定义这些也确保了对引用文件的更改不会破坏任何内容。
如果您只需要共享单个服务并且熟悉要扩展到的文件,以便您可以调整配置,那么 extends
非常有用。但是,当您想要重用其他人不熟悉的配置并且不了解其自身依赖关系时,这并不是一个可接受的解决方案。
相对路径
当使用带有指向另一个文件夹的 file
属性的 extends
时,被扩展服务声明的相对路径会进行转换,以便在使用扩展服务时它们仍然指向同一文件。以下示例对此进行了说明
基础 Compose 文件
services:
webapp:
image: example
extends:
file: ../commons/compose.yaml
service: base
commons/compose.yaml
文件
services:
base:
env_file: ./container.env
生成的服务引用了 commons
目录中的原始 container.env
文件。这可以通过检查实际模型的 docker compose config
命令来确认
services:
webapp:
image: example
env_file:
- ../commons/container.env