扩展您的 Compose 文件

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

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

重要的

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

怎么运行的

从另一个文件扩展服务

举个例子:

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

这指示 Compose 仅​​重用文件webapp中定义的服务的属性common-services.yaml。该webapp服务本身不是最终项目的一部分。

如果common-services.yaml 看起来像这样:

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

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

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

定义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

示例二

另一个常见用例extends是针对 Compose 应用程序中的一个或多个服务运行一次性任务或管理任务。此示例演示运行数据库备份。

定义docker-compose.yml基本配置。

services:
  web:
    image: example/my_web_app:latest
    depends_on:
      - db

  db:
    image: postgres:latest

docker-compose.admin.yml添加新服务来运行数据库导出或备份。

services:
  dbadmin:
    build: database_admin/
    depends_on:
      - db

要启动正常环境,请运行docker compose up -d.要运行数据库备份,docker-compose.admin.yml还请包括。

$ docker compose -f docker-compose.yml -f docker-compose.admin.yml \
  run dbadmin db-backup

按照在命令行上指定的顺序编写扩展文件。

例外与限制

volumes_from并且depends_on永远不会在使用 的服务之间共享 extends。这些例外的存在是为了避免隐式依赖;你总是volumes_from在本地定义。这确保在读取当前文件时服务之间的依赖关系清晰可见。在本地定义这些还可以确保对引用文件的更改不会破坏任何内容。

extends如果您只需要共享一个服务并且您熟悉要扩展的文件,那么您可以调整配置,这非常有用。但是,当您想要重用别人不熟悉的配置并且您不了解其自身的依赖项时,这不是一个可接受的解决方案。

相对路径

extends当与指向另一个文件夹的属性一起使用时file,正在扩展的服务声明的相对路径将被转换,以便扩展服务使用时它们仍然指向相同的文件。下面的示例对此进行了说明:

基本撰写文件:

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

参考信息