Compose で プロフィール を使う¶
これにより、1つの 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_PROFILE 環境変数 を使います。
$ docker-compose --profile debug up
$ COMPOSE_PROFILES=debug docker-compose up
このコマンドは、どちらも debug プロフィールを有効にしてアプリケーションを起動します。先述の docker-compose.yml ファイルを使えば、これによってサービス backend 、 db 、 phpmyadmin が起動します。
複数のプロフィールを指定するには、複数の --profile フラグを使うか、 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