在 Compose 中使用配置文件
compose.yml
文件中,并且仅在需要时激活。将配置文件分配给服务
服务通过 profiles
属性 与配置文件关联,该属性接受配置文件名称的数组。
services:
frontend:
image: frontend
profiles: [frontend]
phpmyadmin:
image: phpmyadmin
depends_on: [db]
profiles: [debug]
backend:
image: backend
db:
image: mysql
此处,服务 frontend
和 phpmyadmin
分别分配给配置文件 frontend
和 debug
,因此只有在启用其各自配置文件时才会启动。
没有 profiles
属性的服务始终处于启用状态。在这种情况下,运行 docker compose up
仅会启动 backend
和 db
。
有效的配置文件名称遵循 [a-zA-Z0-9][a-zA-Z0-9_.-]+
的正则表达式格式。
提示
应用程序的核心服务不应该分配
profiles
,这样它们始终处于启用状态并自动启动。
启动特定配置文件
要启动特定配置文件,请提供 --profile
命令行选项 或使用 COMPOSE_PROFILES
环境变量
$ docker compose --profile debug up
$ COMPOSE_PROFILES=debug docker compose up
以上命令都会启动应用程序并启用 debug
配置文件。在上面的 compose.yml
文件示例中,这会启动服务 backend
、db
和 phpmyadmin
。
启动多个配置文件
你还可以启用多个配置文件,例如,使用 docker compose --profile frontend --profile debug up
,配置文件 frontend
和 debug
将被启用。
可以通过传递多个 --profile
标志或为 COMPOSE_PROFILES
环境变量传递逗号分隔的列表来指定多个配置文件。
$ docker compose --profile frontend --profile debug up
$ COMPOSE_PROFILES=frontend,debug docker compose up
如果你想同时启用所有配置文件,可以运行 docker compose --profile "*"
。
自动启动配置文件和依赖关系解析
当命令行上显式指定了分配了 profiles
的服务时,其配置文件会自动启动,因此你无需手动启动它们。这可以用于一次性服务和调试工具。例如,考虑以下配置
services:
backend:
image: backend
db:
image: mysql
db-migrations:
image: backend
command: myapp migrate
depends_on:
- db
profiles:
- tools
# Only start backend and db
$ docker compose up -d
# This runs db-migrations (and,if necessary, start db)
# by implicitly enabling the profiles `tools`
$ docker compose run db-migrations
但请记住,docker compose
仅会自动启动命令行上服务的配置文件,而不会启动任何依赖项的配置文件。
这意味着目标服务 depends_on
的任何其他服务都应该:
- 共享一个通用配置文件
- 始终启动,通过省略
profiles
或显式启动匹配的配置文件
services:
web:
image: web
mock-backend:
image: backend
profiles: ["dev"]
depends_on:
- db
db:
image: mysql
profiles: ["dev"]
phpmyadmin:
image: phpmyadmin
profiles: ["debug"]
depends_on:
- db
# Only start "web"
$ docker compose up -d
# Start mock-backend (and, if necessary, db)
# by implicitly enabling profiles `dev`
$ docker compose up -d mock-backend
# This fails because profiles "dev" is not enabled
$ docker compose up phpmyadmin
虽然定位 phpmyadmin
会自动启动配置文件 debug
,但它不会自动启动 db
所需的配置文件,即 dev
。
要解决这个问题,你需要将 debug
配置文件添加到 db
服务中:
db:
image: mysql
profiles: ["debug", "dev"]
或者显式启动 dev
配置文件:
# Profiles "debug" is started automatically by targeting phpmyadmin
$ docker compose --profile dev up phpmyadmin
$ COMPOSE_PROFILES=dev docker compose up phpmyadmin