在文件和项目之间共享Compose配置

预计阅读时间:10分钟

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

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

多个撰写文件

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

了解多个撰写文件

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

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

要使用多个替代文件或具有不同名称的替代文件,可以使用该-f选项指定文件列表。Compose按照在命令行上指定的顺序合并文件。有关使用的更多信息,请参见 docker-compose命令参考-f

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

用例范例

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

不同的环境

多个文件的常见用例是将开发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它会自动读取覆盖。

现在,很高兴在生产环境中使用此Compose应用程序。因此,请创建另一个替代文件(该文件可以存储在其他git repo中,也可以由其他团队进行管理)。

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(但不是在开发配置docker-compose.override.yml)。

有关生产中撰写的更多信息,请参见生产。

行政任务

另一个常见用例是针对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

扩展服务

笔记

extends直到Compose文件版本2.1(请参阅v2中的扩展),早期的Compose文件格式均支持该关键字,但Compose版本3.x不支持该关键字。请参阅第3版 添加和删​​除的密钥摘要,以及有关如何升级的信息。请参阅moby / moby#31101,以跟随讨论主题以了解extends在将来的版本中以某种形式添加对它的支持的可能性。

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

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

了解扩展配置

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

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

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

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

在这种情况下,您获得的结果与使用编写 docker-compose.yml的完全相同buildports并且volumes直接在之下定义了配置值web

您可以在以下位置进一步定义本地配置(或重新定义) 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

用例范例

当您具有具有共同配置的多个服务时,扩展单个服务很有用。下面的示例是具有两个服务的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

添加和覆盖配置

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

对于诸如或的单值选项image,新值将替换旧值。commandmem_limit

原始服务:

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

本地服务:

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

结果:

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

对于多值的选项 portsexposeexternal_linksdnsdns_search,和tmpfs,撰写串接两组的值:

原始服务:

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

本地服务:

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

结果:

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

在的情况下environmentlabelsvolumes,和devices,撰写“合并”的条目与本地定义的值取优先在一起。对于 environmentlabels,环境变量或标签名称确定使用哪个值:

原始服务:

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

本地服务:

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

结果

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

条目volumesdevices正在使用的安装在容器路径合并:

原始服务:

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

本地服务:

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

结果:

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

撰写文件

无花果组成撰写码头工人编排文档文档