扩展 Compose 文件

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

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

重要

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

运作方式

从另一个文件扩展服务

以以下示例为例:

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,portsvolumes配置 直接在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

其他示例

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

common.yamlfile 定义通用配置:

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

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

相对路径

使用extends替换为file指向另一个文件夹的属性、相对路径 被 extended 的服务所声明的 Extending 服务使用时相同的文件。以下示例对此进行了说明:

Base Compose 文件:

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

commons/compose.yaml文件:

services:
  base:
    env_file: ./container.env

生成的服务将引用原始的container.env文件 在commons目录。这可以通过docker compose config检查实际模型:

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

参考资料