在 Compose 中使用配置文件

配置文件可以帮助你通过有选择地激活服务来调整 Compose 应用程序以适应不同的环境或用例。服务可以分配给一个或多个配置文件;未分配的服务默认启动,而分配的服务只有在启用其配置文件时才会启动。这种设置意味着特定的服务(例如用于调试或开发的服务)可以包含在单个 compose.yml 文件中,并且仅在需要时激活。

将配置文件分配给服务

服务通过 profiles 属性 与配置文件关联,该属性接受配置文件名称的数组。

services:
  frontend:
    image: frontend
    profiles: [frontend]

  phpmyadmin:
    image: phpmyadmin
    depends_on: [db]
    profiles: [debug]

  backend:
    image: backend

  db:
    image: mysql

此处,服务 frontendphpmyadmin 分别分配给配置文件 frontenddebug,因此只有在启用其各自配置文件时才会启动。

没有 profiles 属性的服务始终处于启用状态。在这种情况下,运行 docker compose up 仅会启动 backenddb

有效的配置文件名称遵循 [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 文件示例中,这会启动服务 backenddbphpmyadmin

启动多个配置文件

你还可以启用多个配置文件,例如,使用 docker compose --profile frontend --profile debug up,配置文件 frontenddebug 将被启用。

可以通过传递多个 --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

参考信息

配置文件