使用docker-compose扩展服务

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

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

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

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

了解多个compose文件

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

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

要使用多个替代文件或具有不同名称的替代文件,可以使用-f选项指定文件列表。 Compose以在命令行中指定的顺序合并文件。

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

用例范例

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

不同的环境

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

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

docker-compose.yml

version: '3'
services:
  web:
    image: myusername/web_app:latest
    depends_on:
      - db
      - cache
    
  db:
   image: postgres:latest
   
  cache:
    image: redis:latest

在此示例中,开发配置将一些端口暴露给主机,将我们的代码作为卷挂载,并构建Web镜像。
docker-compose.override.yml

version: '3'
services:
  web:
  	bulid: .
  	volumes:
  	  - '.:/code'
  	ports:
  	  - 8000:80
    environment:
      DEBUG: 'true'
  db:
    ports:
      - 5432:5432
  cache:
    ports:
      - 6379:6379

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

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

version: '2'
services:
  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中的dev配置)部署所有三个服务。

有关生产中compose的更多信息,请参见生产

管理任务

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

docker-compose.yml开始。

version: '2'
services:
  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
扩展服务

注意:直到Compose文件版本2.1之前的早期Compose文件格式都支持extend关键字(请参阅v1中的扩展名和v2中的扩展名),但Compose版本3.x不支持。请参阅第3版中添加和删除的密钥摘要以及有关如何升级的信息。有关在将来的版本中以某种形式添加对扩展的支持的可能性,请参见moby / moby#31101以遵循讨论主题。

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

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

了解扩展配置

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

version: '2'
services:
  web:
    extends:
      file: common-services.yml
      service:webapp

这指示Compose重新使用common-services.yml文件中定义的webapp服务的配置。 假设common-services.yml如下所示:

version: '2'
service:
  webapp:
    build: .
    ports:
      - "8000:8000"
    volumes:
      - "/data"

在这种情况下,您得到的结果与编写docker-compose.yml的结果完全相同,而docker-compose.yml具有直接在Web下定义的相同的内部版本,端口和卷配置值。

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

version: '2'
services:
  web:
    extends:
      file: compose-services.yml
      service: webapp
    environment:
     - DEBUG=1
    cpu_shares: 5
    
  important_web:
    extends: web
    cpu_shares:10

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

version: '2'
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中,我们定义公共配置:

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

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

version: '2'
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
添加和覆盖配置

Compose将配置从原始服务复制到本地。 如果在原始服务和本地服务中都定义了配置选项,则本地值将替换或扩展原始值。
对于imagecommandmem_limit之类的单值选项,新值将替换旧值。

# original service 原始服务
command: python app.py

# local service 本地服务
command: python otherapp.py

# result 结果
command: python otherapp.py

对于build和image,如果使用Compose文件格式的version 1,则在本地服务中使用一个选项会导致Compose放弃另一个选项(如果它是在原始服务中定义的)。 例如,如果原始服务定义了image:webapp,而本地服务定义了build:. 那么生成的服务具有以下 build:. 并且没有图像选项。这是因为build和image不能在 version 1文件中一起使用。

对于多值选项 portexposeexternal_linksdnsdns_searchtmpfs,Compose将这两组值连接在一起:

# original service
expose:
  - "3000"

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

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

对于 environmentlablesvolumesdevices的情况下,将“merge”条目与本地定义的值放在首位。 对于environmentlables,环境变量或标签名称确定使用哪个值:

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

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

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

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

# original service
volumes:
  - ./original:/foo
  - ./original:/bar

# local service
volumes:
  - ./local:/bar
  - ./local:/baz

# result
volumes:
  - ./original:/foo
  - ./local:/bar
  - ./local:/baz
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值