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
ここでサービス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
上のコマンド 2 つは、いずれもプロファイルdebug
を有効にしてアプリケーションを起動します。
前述のdocker-compose.yml
ファイルを利用している場合、これはbackend
、db
、phpmyadmin
の各サービスが起動することになります。
プロファイルは複数指定することができます。
その場合は--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