扩展 Compose 文件

Docker Compose 的 extends 属性允许您在不同的文件甚至不同的文件之间共享通用配置 项目。

如果您有多个服务重用一个通用的 配置选项集。使用 You 可以定义一组通用的 服务选项,并可从任何位置引用它。您可以参考 另一个 Compose 文件,然后选择您自己也想使用的服务 应用程序,并能够根据自己的需要覆盖某些属性。extends

重要

使用多个 Compose 文件时,必须确保文件中的所有路径 是相对于基本 Compose 文件(即 main-project 文件夹中的 Compose 文件)的。这是必需的,因为扩展文件 不必是有效的 Compose 文件。扩展文件可以包含 配置。跟踪服务的哪个片段相对于哪个路径 困难且令人困惑,因此为了使路径更易于理解,所有路径都必须 相对于 base 文件进行定义。

运作方式

从另一个文件扩展服务

以以下示例为例:

services:
  web:
    extends:
      file: common-services.yml
      service: webapp

这会指示 Compose 仅重复使用服务的属性 定义。服务本身不是最终项目的一部分。webappcommon-services.ymlwebapp

如果如下所示:common-services.yml

services:
  webapp:
    build: .
    ports:
      - "8000:8000"
    volumes:
      - "/data"

您得到的结果与使用相同的 、 和 配置编写的结果完全相同 直接在 下定义的值。docker-compose.ymlbuildportsvolumesweb

要在从另一个文件扩展服务时将服务包含在最终项目中,您需要在当前 Compose 文件中显式包含这两个服务。例如(注意这是一个非规范性示例):webapp

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

其他示例

当您拥有多个服务时,扩展单个服务非常有用 具有通用配置。以下示例是一个包含两个 services、Web 应用程序和 queue worker。两种服务使用相同的 代码库并共享许多配置选项。

该文件定义了通用配置:common.yaml

services:
  app:
    build: .
    environment:
      CONFIG_FILE_PATH: /code/config
      API_KEY: xxxyyy
    cpu_shares: 5

定义了使用公共 配置:docker-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并且永远不会在使用 .存在这些异常以避免隐式依赖关系;你总是 define locally 的 define 中。这可确保服务之间的依赖关系 在读取当前文件时清晰可见。在本地定义这些 确保对引用文件的更改不会破坏任何内容。depends_onextendsvolumes_from

extends如果您只需要共享一个服务,并且您 熟悉要扩展到的文件,因此您可以调整 配置。但是,当您想要重复使用时,这不是一个可接受的解决方案 别人不熟悉的配置,而你不知道它自己的 依赖。

相对路径

当与指向另一个文件夹的属性一起使用时,相对路径 被 extended 的服务所声明的 Extending 服务使用时相同的文件。以下示例对此进行了说明:extendsfile

Base Compose 文件:

services:
  webapp:
    image: example
    extends:
      file: ../commons/compose.yaml
      service: base

文件:commons/compose.yaml

services:
  base:
    env_file: ./container.env

生成的服务引用原始文件 在目录中。这可以通过检查实际模型来确认:container.envcommonsdocker compose config

services:
  webapp:
    image: example
    env_file: 
      - ../commons/container.env

参考资料