Compose でのプロファイル利用

読む時間の目安: 2 分

プロファイル(profile)は Compose アプリケーションモデルをさまざまな利用方法に合わせて調整するものです。 また有効とするサービスを選択した環境実現も行います。 具体的には各サービスに対して、プロファイルを割り当てない状態も含め、複数のプロファイルを割り当てます。 割り当てを行わなかった場合、そのサービスは 常に 起動します。 一方割り当てを行った場合は、そのプロファイルがアクティブになった場合にのみサービスが起動します。

こういった機能があると、たとえばデバッグ時や開発タスク作業時といった特定の状況下においてのみ起動する追加のサービスを、同一のdocker-compose.ymlファイル内に定義して実現することができます。

サービスへのプロファイルの割り当て

サービスに対しては profiles属性 を通じてプロファイルを関連づけることができます。 この属性にはプロファイル名の配列を指定します。

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_PROFILESを利用します。

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

上のコマンド 2 つは、いずれもプロファイルdebugを有効にしてアプリケーションを起動します。 前述のdocker-compose.ymlファイルを利用している場合、これはbackenddbphpmyadminの各サービスが起動することになります。

プロファイルは複数指定することができます。 その場合は--profileフラグを複数指定するか、あるいは環境変数COMPOSE_PROFILESに対してカンマ区切りのリストを指定します。

$ 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

# これはプロファイル`tools`は暗に有効化した上で、
# db-migrationsを実行します(必要に応じてdbも起動します)。
$ 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

# これはプロファイル`dev`は暗に有効化した上で、
# mock-backendを実行します(必要に応じてdbも起動します)。
$ docker-compose up -d mock-backend

# プロファイル"dev"が無効なためこのコマンドは失敗します。
$ docker-compose up phpmyadmin

phpmyadminを指定して実行すれば、割り当てられているプロファイルつまりdebugは自動的に有効になります。 しかしdbに割り当てられているプロファイルつまりdevまでは自動的に有効にはしません。 これを正しくするには、dbサービスに対してもdebugプロファイルを追加しなければなりません。

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

またはdbのプロファイルを明示的に有効化する方法とします。

# phpmyadmin指定に際してプロファイル"debug"を有効にします。
$ docker-compose --profile dev up phpmyadmin
$ COMPOSE_PROFILES=dev docker-compose up phpmyadmin

Compose ドキュメント

cli, compose, profile, profiles reference