Share Compose configurations between files and projects

预计阅读时间:10分钟

Compose 支持两种共享通用配置的方法:

  1. 使用多个 Compose 文件扩展整个 Compose 文件
  2. 使用extends字段扩展单个服务(适用于高达 2.1 的 Compose 文件版本)

Multiple Compose files

使用多个 Compose 文件,您可以针对不同的环境或不同的工作流程自定义 Compose 应用程序.

Understanding multiple Compose files

默认情况下,Compose 读取两个文件,一个docker-compose.yml和一个可选docker-compose.override.yml文件. 按照惯例, docker-compose.yml包含您的基本配置. 顾名思义,覆盖文件可以包含现有服务或全新服务的配置覆盖.

如果在两个文件中都定义了服务,则 Compose 使用添加和覆盖配置中描述的规则合并配置.

要使用多个覆盖文件或具有不同名称的覆盖文件,您可以使用-f选项指定文件列表. Compose 按照在命令行中指定的顺序合并文件. 有关使用-f的更多信息,请参阅docker-compose命令参考.

当您使用多个配置文件时,您必须确保文件中的所有路径都相对于基本 Compose 文件(使用-f指定的第一个 Compose 文件). 这是必需的,因为覆盖文件不必是有效的 Compose 文件. 覆盖文件可以包含配置的小片段. 跟踪服务的哪个片段与哪个路径相关是困难且令人困惑的,因此为了使路径更易于理解,必须相对于基本文件定义所有路径.

Example use case

在本节中,多个 Compose 文件有两个常见用例:针对不同环境更改 Compose 应用程序,以及针对 Compose 应用程序运行管理任务.

Different environments

多个文件的常见用例是将开发 Compose 应用程序更改为类似生产的环境(可能是生产、登台或 CI). 为了支持这些差异,您可以将 Compose 配置拆分为几个不同的文件:

从定义服务的规范配置的基本文件开始.

docker-compose.yml

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

db:
  image: postgres:latest

cache:
  image: redis:latest

在此示例中,开发配置向主机公开了一些端口,将我们的代码挂载为卷,并构建 Web 映像.

docker-compose.override.yml

web:
  build: .
  volumes:
    - '.:/code'
  ports:
    - 8883:80
  environment:
    DEBUG: 'true'

db:
  command: '-d'
  ports:
    - 5432:5432

cache:
  ports:
    - 6379:6379

当您运行docker-compose up ,它会自动读取覆盖.

Now, it would be nice to use this Compose app in a production environment. So, create another override file (which might be stored in a different git repo or managed by a different team).

docker-compose.prod.yml

web:
  ports:
    - 80:80
  environment:
    PRODUCTION: 'true'

cache:
  environment:
    TTL: '500'

要使用此生产 Compose 文件进行部署,您可以运行

$ docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d

这将使用docker-compose.ymldocker-compose.prod.yml -compose.prod.yml 中的配置部署所有三个服务(但不使用docker-compose.override.yml -compose.override.yml 中的 dev 配置).

有关 Compose 在生产中的更多信息,请参阅生产.

Administrative tasks

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

docker-compose.yml开始.

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

db:
  image: postgres:latest

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

    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

Extending services

Note

在 Compose 文件版本 2.1 之前的早期 Compose 文件格式中支持extends关键字(请参阅v2 中的扩展),但在 Compose 版本 3.x 中不支持. 请参阅第3 版添加和删除的密钥摘要,以及有关如何升级的信息. 请参阅moby/moby#31101以关注关于在未来版本中以某种形式添加对extends的支持的可能性的讨论线程. extends关键字已包含在 docker-compose 1.27 及更高版本中.

Docker Compose 的extends关键字可以在不同的文件甚至完全不同的项目之间共享通用配置. 如果您有多个重用一组通用配置选项的服务,则扩展服务很有用. 使用extends ,您可以在一个地方定义一组通用的服务选项,并从任何地方引用它.

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

Understand the extends configuration

docker-compose.yml中定义任何服务时,您可以声明您正在扩展另一个服务,如下所示:

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

这指示 Compose 重新使用common-services.yml文件中定义的webapp服务的配置. 假设common-services.yml看起来像这样:

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

在这种情况下,您得到的结果与使用直接在web下定义的相同buildportsvolumes配置值编写docker-compose.yml完全相同.

您可以进一步在docker-compose.yml本地定义(或重新定义)配置:

services:
  web:
    extends:
      file: common-services.yml
      service: webapp
    environment:
      - DEBUG=1
    cpu_shares: 5

  important_web:
    extends: web
    cpu_shares: 10

您还可以编写其他服务并将您的web服务链接到它们:

services:
  web:
    extends:
      file: common-services.yml
      service: webapp
    environment:
      - DEBUG=1
    cpu_shares: 5
    depends_on:
      - db
  db:
    image: postgres

Example use case

当您有多个具有共同配置的服务时,扩展单个服务很有用. 下面的示例是一个具有两个服务的 Compose 应用程序:一个 Web 应用程序和一个队列工作者. 两种服务使用相同的代码库并共享许多配置选项.

common.yml 中我们定义了通用配置:

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

docker-compose.yml 中,我们定义了使用通用配置的具体服务:

services:
  webapp:
    extends:
      file: common.yml
      service: app
    command: /code/run_web_app
    ports:
      - 8080:8080
    depends_on:
      - queue
      - db

  queue_worker:
    extends:
      file: common.yml
      service: app
    command: /code/run_worker
    depends_on:
      - queue

Adding and overriding configuration

Compose 将配置从原始服务复制到本地服务. 如果在原始服务和本地服务中都定义了配置选项,则本地值替换扩展原始值.

对于imagecommandmem_limit等单值选项,新值将替换旧值.

原服务:

services:
  myservice:
    # ...
    command: python app.py

本地服务:

services:
  myservice:
    # ...
    command: python otherapp.py

result:

services:
  myservice:
    # ...
    command: python otherapp.py

对于多值选项portsexposeexternal_linksdnsdns_searchtmpfs ,Compose 连接两组值:

原服务:

services:
  myservice:
    # ...
    expose:
      - "3000"

本地服务:

services:
  myservice:
    # ...
    expose:
      - "4000"
      - "5000"

result:

services:
  myservice:
    # ...
    expose:
      - "3000"
      - "4000"
      - "5000"

environmentlabelsvolumesdevices的情况下,组合"合并"条目以及优先使用本地定义的值. 对于environmentlabels ,环境变量或标签名称决定了使用哪个值:

原服务:

services:
  myservice:
    # ...
    environment:
      - FOO=original
      - BAR=original

本地服务:

services:
  myservice:
    # ...
    environment:
      - BAR=local
      - BAZ=local

result

services:
  myservice:
    # ...
    environment:
      - FOO=original
      - BAR=local
      - BAZ=local

使用容器中的挂载路径合并volumesdevices的条目:

原服务:

services:
  myservice:
    # ...
    volumes:
      - ./original:/foo
      - ./original:/bar

本地服务:

services:
  myservice:
    # ...
    volumes:
      - ./local:/bar
      - ./local:/baz

result:

services:
  myservice:
    # ...
    volumes:
      - ./original:/foo
      - ./local:/bar
      - ./local:/baz

Compose documentation

fig, composition, compose, docker, orchestration, documentation, docs

by  icopy.site