首页
学习
活动
专区
工具
TVP
发布

Compose中的扩展服务 | Extend services in Compose

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

  1. 扩展整个撰写文件使用多个组合文件
  1. 扩展个人服务大extends场域

多重合成文件

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

理解多重组合文件

默认情况下,撰写读取两个文件,docker-compose.yml还有一个可选的docker-compose.override.yml档案。根据惯例,docker-compose.yml包含基本配置。正如其名称所暗示的那样,覆盖文件可以包含对现有服务或全新服务的配置重写。

如果在两个文件中都定义了服务,则使用添加和覆盖配置.

若要使用多个覆盖文件或具有不同名称的重写文件,可以使用-f选项指定文件列表。按照命令行中指定的顺序编写合并文件。docker-compose命令引用有关使用-f

使用多个配置文件时,必须确保文件中的所有路径相对于基本组合文件。这是必需的,因为重写文件不一定是有效的组合文件。覆盖文件可以包含小的配置片段。跟踪服务的哪个片段相对于哪个路径比较困难和混乱,因此,为了使路径更容易理解,必须相对于基文件定义所有路径。

用例

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

不同环境

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

从一个基本文件开始,它定义了服务的规范配置。

Docker-Compose.yml

web:
  image: example/my_web_app:latest
  links:
    - 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 仓库或由不同的团队管理)。

Docker-Compose.prod.yml

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

cache:
  environment:
    TTL: '500'

要使用此产品组合文件进行部署,可以运行

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
  links:
    - db

db:
  image: postgres:latest

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

dbadmin:
  build: database_admin/
  links:
    - 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 文件格式中支持到 Compose 文件版本2.1(请参阅v1中的扩展和第2版中的扩展),但在 Compose 版本3.x中不受支持。请参阅第3版的添加和删除键摘要以及有关如何升级的信息。请参阅 moby / moby#31101 以关注extends在未来版本中以某种形式添加支持的可能性。

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

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

理解扩展配置

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

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

此指令将编写为重用webapp中定义的服务。common-services.yml档案。假设common-services.yml看起来是这样的:

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

在这种情况下,您将得到完全相同的结果,就像您编写docker-compose.yml用同样的buildportsvolumes直接定义在web.

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

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

important_web:
  extends: web
  cpu_shares: 10

您还可以编写其他服务并链接web向他们提供服务:

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

用例

当您有多个具有公共配置的服务时,扩展单个服务非常有用。下面的示例是一个包含两个服务的撰写应用程序:一个 Web 应用程序和一个队列工作程序。这两个服务使用相同的代码库,并共享许多配置选项。

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

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

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

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

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

添加和覆盖配置

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

对于单值选项imagecommand或者mem_limit,新值替换旧值。

# original service
command: python app.py

# local service
command: python otherapp.py

# result
command: python otherapp.py

buildimage在撰写文件版本1 如属buildimage,使用时编写文件格式的版本1,如果在原始服务中定义了另一个选项,则使用本地服务中的一个选项将导致组合放弃另一个选项。 例如,如果原始服务定义image: webapp本地服务定义build: .则结果服务将具有build: .而不是image选择。 这是因为buildimage不能在版本1文件中一起使用。

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

# original service
expose:
  - "3000"

# local service
expose:
  - "4000"
  - "5000"

# result
expose:
  - "3000"
  - "4000"
  - "5000"

environmentlabelsvolumesdevices情况下,撰写“合并”的条目连同本地定义的值取的优先级:

# original service
environment:
  - FOO=original
  - BAR=original

# local service
environment:
  - BAR=local
  - BAZ=local

# result
environment:
  - FOO=original
  - BAR=local
  - BAZ=local

撰写文件

  • 用户指南
  • 安装组合
  • 开始
  • 从Django开始
  • 从Rails开始
  • 从WordPress开始
  • 命令行引用
  • 合成文件引用

扫码关注腾讯云开发者

领取腾讯云代金券