扩展你的 Compose 文件

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

如果你有多个服务重用一组通用配置选项,扩展服务会很有用。使用 extends,你可以在一个地方定义一组通用服务选项,并从任何地方引用它。你可以引用另一个 Compose 文件并选择你想要在自己的应用程序中使用的服务,并能够根据自己的需求覆盖某些属性。

重要

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

extends 属性的工作原理

从另一个文件扩展服务

请看以下示例

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"

你将获得与直接在 web 下定义相同的 buildportsvolumes 配置值写入 compose.yaml 完全相同的结果。

要从另一个文件扩展服务时将服务 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

相对路径

当使用带有指向另一个文件夹的 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

参考信息

© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.