Compose中的扩展服务 | Extend services in Compose
在文件和项目之间共享组合配置
Compose 支持两种共享通用配置的方法:
- 扩展整个撰写文件使用多个组合文件
- 扩展个人服务大
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.yml
和docker-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
您可以在一个地方定义一套通用的服务选项,并从任何地方引用它。
记住links
,volumes_from
和depends_on
从不使用extends
服务之间共享。这些例外存在以避免隐式依赖性; 你总是本地定义links
和volumes_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
用同样的build
,ports
和volumes
直接定义在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
添加和覆盖配置
将副本配置从原始服务复制到本地服务。如果在原始服务和本地服务中都定义了配置选项,则本地值取代或扩展原始价值。
对于单值选项image
,command
或者mem_limit
,新值替换旧值。
# original service
command: python app.py
# local service
command: python otherapp.py
# result
command: python otherapp.py
build
和image
在撰写文件版本1 如属build
和image
,使用时编写文件格式的版本1,如果在原始服务中定义了另一个选项,则使用本地服务中的一个选项将导致组合放弃另一个选项。 例如,如果原始服务定义image: webapp
本地服务定义build: .
则结果服务将具有build: .
而不是image
选择。 这是因为build
和image
不能在版本1文件中一起使用。
对于多值的选项
ports
,expose
,external_links
,dns
,dns_search
,和tmpfs
,撰写会连接两组的值:
# original service
expose:
- "3000"
# local service
expose:
- "4000"
- "5000"
# result
expose:
- "3000"
- "4000"
- "5000"
在environment
,labels
,volumes
和devices
情况下,撰写“合并”的条目连同本地定义的值取的优先级:
# 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开始
- 命令行引用
- 合成文件引用
fig, composition, compose, docker, orchestration, documentation, docs