合并 Compose 文件
Docker Compose 允许您将一组 Compose 文件合并和覆盖在一起,以创建复合 Compose 文件。
默认情况下,Compose 会读取两个文件:一个和一个可选文件。按照惯例, 包含您的基本配置。覆盖文件可以
包含现有服务或全新服务的配置覆盖
服务业。compose.yaml
compose.override.yaml
compose.yaml
如果在这两个文件中都定义了服务,则 Compose 会使用 下面和 Compose 规范中描述的规则。
如何合并多个 Compose 文件
要使用多个覆盖文件或具有不同名称的覆盖文件,请
可以使用预定义的 COMPOSE_FILE 环境变量,也可以使用 option 指定文件列表。-f
Compose 将文件合并到 它们在命令行上指定的顺序。后续文件可能会合并、覆盖或 添加到他们的前辈。
例如:
$ docker compose -f compose.yaml -f compose.admin.yaml run backup_db
该文件可能指定一个服务。compose.yaml
webapp
webapp:
image: examples/web
ports:
- "8000:8000"
volumes:
- "/data"
还可以指定相同的服务:compose.admin.yaml
webapp:
environment:
- DEBUG=1
任何匹配项
fields 将覆盖上一个文件。新值,添加到服务
配置:webapp
webapp:
image: examples/web
ports:
- "8000:8000"
volumes:
- "/data"
environment:
- DEBUG=1
合并规则
路径是相对于基本文件进行评估的。使用多个 Compose 文件时,必须确保文件中的所有路径都相对于基本 Compose 文件(指定的第一个 Compose 文件 与 )。这是必需的,因为覆盖文件不必有效 编写文件。覆盖文件可以包含小的配置片段。 跟踪服务的哪个片段相对于哪个路径是困难的,并且 令人困惑,因此为了使路径更易于理解,必须定义所有路径 相对于基本文件。
-f
提示
您可以使用 来查看合并的配置并避免与路径相关的问题。
docker compose config
Compose 会将配置从原始服务复制到本地服务。 如果在原始服务和本地 service,则 local 值将替换或扩展原始值。
对于单值选项(如 , 或 ),新值将替换旧值。
image
command
mem_limit
原厂服务:
services: myservice: # ... command: python app.py
本地服务:
services: myservice: # ... command: python otherapp.py
结果:
services: myservice: # ... command: python otherapp.py
对于多值选项 、 、 、 、 和 ,Compose 将连接这两组值:
ports
expose
external_links
dns
dns_search
tmpfs
原厂服务:
services: myservice: # ... expose: - "3000"
本地服务:
services: myservice: # ... expose: - "4000" - "5000"
结果:
services: myservice: # ... expose: - "3000" - "4000" - "5000"
对于 、 、 和 ,Compose 会将条目与优先的本地定义值“合并”在一起。对于 和 ,环境变量或标签名称确定使用哪个值:
environment
labels
volumes
devices
environment
labels
原厂服务:
services: myservice: # ... environment: - FOO=original - BAR=original
本地服务:
services: myservice: # ... environment: - BAR=local - BAZ=local
结果:
services: myservice: # ... environment: - FOO=original - BAR=local - BAZ=local
的条目 和 使用容器中的挂载路径进行合并:
volumes
devices
原厂服务:
services: myservice: # ... volumes: - ./original:/foo - ./original:/bar
本地服务:
services: myservice: # ... volumes: - ./local:/bar - ./local:/baz
结果:
services: myservice: # ... volumes: - ./original:/foo - ./local:/bar - ./local:/baz
有关更多合并规则,请参阅 Compose 规范中的 Merge and override 。
其他信息:
using 是可选的。如果未提供,则 Compose 会在工作目录及其父目录中搜索 a 和 file。您必须至少提供文件。如果这两个文件都位于同一目录级别,则 Compose 会将它们合并到一个配置中。
-f
compose.yaml
compose.override.yaml
compose.yaml
您可以使用 with (dash) 作为文件名,从 中读取配置 。例如:
-f
-
stdin
$ docker compose -f - <<EOF webapp: image: examples/web ports: - "8000:8000" volumes: - "/data" environment: - DEBUG=1 EOF
When used 时,配置中的所有 paths 都是相对于当前工作目录的。
stdin
您可以使用该标志指定不在当前目录中的 Compose 文件的路径,无论是从命令行还是通过在 shell 或环境中设置 COMPOSE_FILE 环境变量。
-f
例如,如果您正在运行 Compose Rails 示例,并且在名为 .您可以使用类似 docker compose pull 的命令从任何位置获取服务的 postgres 镜像,方法是使用如下所示的标志:
compose.yaml
sandbox/rails
db
-f
docker compose -f ~/sandbox/rails/compose.yaml pull db
以下是完整的示例:
$ docker compose -f ~/sandbox/rails/compose.yaml pull db Pulling db (postgres:latest)... latest: Pulling from library/postgres ef0380f84d05: Pull complete 50cf91dc1db8: Pull complete d3add4cd115c: Pull complete 467830d8a616: Pull complete 089b9db7dc57: Pull complete 6fba0a36935c: Pull complete 81ef0e73c953: Pull complete 338a6c4894dc: Pull complete 15853f32f67c: Pull complete 044c83d92898: Pull complete 17301519f133: Pull complete dcca70822752: Pull complete cecf11b8ccf3: Pull complete Digest: sha256:1364924c753d5ff7e2260cd34dc4ba05ebd40ee8193391220be0f9901d4e1651 Status: Downloaded newer image for postgres:latest
例
多个文件的常见用例是更改开发 Compose 应用 对于类似生产的环境(可能是生产、暂存或 CI)。 为了支持这些差异,您可以将 Compose 配置拆分为 几个不同的文件:
从定义 服务业。
compose.yaml
services:
web:
image: example/my_web_app:latest
depends_on:
- db
- cache
db:
image: postgres:latest
cache:
image: redis:latest
在此示例中,开发配置将一些端口暴露给 host,将我们的代码挂载为卷,并构建 Web 镜像。
compose.override.yaml
services:
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 中 存储库或由其他团队管理。
compose.prod.yaml
services:
web:
ports:
- 80:80
environment:
PRODUCTION: 'true'
cache:
environment:
TTL: '500'
要使用此生产 Compose 文件进行部署,您可以运行
$ docker compose -f compose.yaml -f compose.prod.yaml up -d
这将使用 中的配置部署所有三个服务,但不使用
dev 配置。compose.yaml
compose.prod.yaml
compose.override.yaml
有关更多信息,请参阅在生产环境中使用 Compose。
局限性
Docker Compose 支持应用程序模型中包含的许多资源的相对路径:服务镜像的构建上下文、定义环境变量的文件位置、绑定挂载卷中使用的本地目录的路径。 在这样的限制下,monorepo 中的代码组织可能会变得困难,因为自然而然的选择是为每个团队或组件提供专用文件夹,但这样 Compose 文件的相对路径就变得无关紧要了。