Compose で プロフィール(profile) を使う

プロフィール(profile) によって、有効化するサービスを選択できるようになるため、様々な使い方や環境にあわせて Compose アプリケーション モデルを調整できます。そのためには、各サービスに対してプロフィールを割り当てないか、あるいは複数のプロフィールを割り当てます。割り当てなければサービスは「常に」起動します。一方、(プロフィールの)割り当てがあれば、そのプロフィールが有効な場合のみ起動します。

これにより、1つの docker-compose.yml ファイルで、たとえばデバッグ用や開発タスクといった、特定の場面でのみ起動する追加サービスを定義できます。

サービスにプロフィールを割り当てる

サービスにプロフィールを割り当てるには、 profiles 属性 にプロフィール名を 配列(array) で記述します。

version: "3.9"
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_PROFILE 環境変数 を使います。

$ docker-compose --profile debug up
$ COMPOSE_PROFILES=debug docker-compose up

このコマンドは、どちらも debug プロフィールを有効にしてアプリケーションを起動します。先述の docker-compose.yml ファイルを使えば、これによってサービス backenddbphpmyadmin が起動します。

複数のプロフィールを指定するには、複数の --profiles フラグを使うか、 COMPOSE_PROFILE 環境変数でカンマ区切りのリストを渡します。

$ docker-compose --profile frontend --profile debug up
$ COMPOSE_PROFILES=frontend,debug docker-compose up

プロフィールの自動有効化と依存関係の解決

コマンドライン上で対象となるサービスに対して明示的に profiles を割り当てる場合、このプロフィールは自動的に有効化されるため、手動で有効化する必要はありません。これは一度だけの実行やデバッグツールに役立ちます。次の設定例で考えましょう。

version: "3.9"
services:
  backend:
    image: backend

  db:
    image: mysql

  db-migrations:
    image: backend
    command: myapp migrate
    depends_on:
      - db
    profiles:
      - tools
# backend と db のみ起動
$ docker-compose up -d

# こちらは db-migrations を実行(必要となる db も起動)するにあたり、
# プロフィール `tools` を自動的に有効化
$ docker-compose run db-migrations

ただし docker-compose は、コマンドライン上でサービスのプロフィールを自動的に有効化しますが、依存関係のプロフィールは有効化しないのを覚えておいてください。つまり、対象とするサービスにある depends_on``で指定された(依存関係のある)サービスは、共通のプロフィールを持つ必要があり、常に有効化される( ``profiles は無視されます)か、明示的に一致するプロフィールを有効化する必要があります。

version: "3.9"
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
# これは「web」だけ起動
$ docker-compose up -d

# これは mock-backend を起動し(必要となる db も起動)、
# 自動的にプロフィール「dev」を有効化
$ docker-compose up -d mock-backend

# これはプロフィール「dev」が無効化されているので起動失敗
$ docker-compose up phpmyadmin

対象が phpmyadmin の場合、そのプロフィール、ここでは debug が自動的に有効化されますが、 db が必要とするプロフィール、ここでは db は自動的に有効化されません。この問題を解決するには、 db サービスに debug プロフィールを追加するか、

db:
  image: mysql
  profiles: ["debug", "dev"]

あるいは db のプロフィールを明示します。

# プロフィール「debug」は対象の phpmyadmin によって自動的に有効化
$ docker-compose --profile dev up phpmyadmin
$ COMPOSE_PROFILES=dev docker-compose up phpmyadmin