サービスの拡張と Compose ファイル

Compose は2つのファイル共有方法をサポートしています。

  1. Compose ファイル全体を 複数の Compose ファイルを使って 拡張する。
  2. 個々のサービスを `extends` フィールド で拡張する。

複数の Compose ファイル

デフォルトでは、Compose は2つのファイルを読み込みます。 docker-compose.yml と、オプションの docker-compose.override.yml (上書き用)ファイルです。慣例として、docker-compose.yml には基本設定を含みます。上書きファイルとは、その名前が暗に示しているように、既存のサービスを新しいサービスに全て置き換えるものです。

もし両方のファイルに定義があれば、Compose は追加された設定の情報でルールを上書きします。

複数の上書きファイルを使いたい場合や、違った名前で上書きしたい場合は、 -f オプションでファイルの一覧を指定可能です。Compose はコマンドライン上で指定した順番で、ファイルを統合します。詳細は docker-compose コマンド・リファレンス-f に関する情報をご覧ください。

複数の設定ファイルを使う場合、全てのパスはベースになる Compose ファイル( -f で1番めに指定したファイル)からの相対パスである必要があります。この指定が必要なのは、上書き用のファイルが適切な Compose ファイル形式でなくても構わないからです。上書きファイルは設定の一部だけでも問題ありません。相対パスで指定されたサービス断片の追跡は、難しく、混乱しがちです。そのため、パスが簡単に分かるようにするため、全てのパスの定義を、ベースファイルからの相対パスにする必要があります。

使用例

このセクションでは、複数の Compose ファイルを使う2つの例をとりあげます。環境の違いにより、構成するアプリを変更する方法。それと、Compose で実行したアプリケーションに対し、管理上のタスクを実行する方法です。

異なる環境

複数のファイルを使う一般的な使用例は、開発環境のアプリ構成を、プロダクション風の環境(プロダクションかもしれませんし、ステージングや CI かもしれません)に変更することです。環境の違いをサポートするには、Compose 設定を複数のファイルに分割します。

まず、サービスを正しく定義するベースファイルは次の通りです。

docker-compose.yml
web:
  image: example/my_web_app:latest
  links:
    - db
    - cache

db:
  image: postgres:latest

cache:
  image: redis:latest

例として、開発環境用の設定に、ホスト上の同じポートを使用し、コードをボリュームとしてマウントし、web イメージを構築するものとします。

docker-compose.override.yml
web:
  build: .
  volumes:
    - '.:/code'
  ports:
    - 8883:80
  environment:
    DEBUG: 'true'

db:
  command: '-d'
  ports:
    - 5432:5432

cache:
  ports:
    - 6379:6379

docker-compose up を実行したら、この上書きファイルを自動的に読み込みます。

次は、Compose を使ったアプリケーションをプロダクション環境で使えるようにします。そのために別の上書きファイルを作成します(このファイルは、異なる git リポジトリに保管されているか、あるいは異なるチームによって管理されているかもしれません)。

docker-compose.prod.yml
web:
  ports:
    - 80:80
  environment:
    PRODUCTION: 'true'

cache:
  environment:
    TTL: '500'

このプロダクション向け Compose ファイルを使ってデプロイするには、次のように実行します。

docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d

3つの全サービスがデプロイに使う設定が docker-compose.ymldocker-compose.prod.yml に含まれています( docker-compose.override.yml に含まれる開発環境はありません)。

Compose をプロダクションで使うための詳細情報は プロダクション をご覧ください。

管理タスク

他の一般的な使い方は、アドホックの実行や、構成アプリの1つまたは複数のサービスに対する管理タスクの実行です。ここでの例は、データベースのバックアップ実行をデモするものです。

docker-compose.yml を次のようにします。

web:
  image: example/my_web_app:latest
  links:
    - db

db:
  image: postgres:latest

docker-compose.admin.yml に、データベースをエクスポートかバックアップする新しいサービスを追加します。

dbadmin:
  build: database_admin/
  links:
    - db

通常の環境を開始するには docker-compose up -d を実行します。データベースのバックアップを行うには、docker-compose.admin.yml も使います。

docker-compose -f docker-compose.yml -f docker-compose.admin.yml \
    run dbadmin db-backup

サービスの拡張

Docker Compose の extends (拡張)キーワードは、異なったファイル間で設定を共有できるだけでなく、異なったプロジェクトでも利用可能です。拡張サービスは複数のサービスを持っている場合、一般的な設定オプションの再利用に便利です。 extends を使えば、1箇所だけでなく、どこでも利用可能なサービス・オプションの共通セットを定義できます。

注釈

extends を使っても linksvolumes_form はサービスを共有しません。このような例外が存在しているのは、依存性が暗黙の内に発生しないようにするためです。 linksvolumes_from は常にローカルで定義すべきです。そうすると、現在のファイルを読み込む時に、依存関係を明確化します。また、参照するファイルを変更したとしても、ローカルで定義する場合は壊れないようにします。

extends 設定の理解

docker-compose.yml で定義したあらゆるサービスは、次のようにして他のサービスからの拡張(extend)を宣言を宣言できます。

web:
  extends:
    file: common-services.yml
    service: webapp

これは common-services.yml ファイルで定義した webapp サービスの設定を、Compose に再利用するよう命令しています。ここでの common-services.yml は、次のようなものと仮定します。

webapp:
  build: .
  ports:
    - "8000:8000"
  volumes:
    - "/data"

この例のように、同様の docker-compose.yml の記述を行えば、web サービスに対する buildportsvolumes 設定が常に同じになります。

更に docker-compose.yml でローカル環境の設定(再設定)も行えます。

web:
  extends:
    file: common-services.yml
    service: webapp
  environment:
    - DEBUG=1
  cpu_shares: 5

important_web:
  extends: web
  cpu_shares: 10

あるいは、他のサービスから web サービスにリンクも可能です。

web:
  extends:
    file: common-services.yml
    service: webapp
  environment:
    - DEBUG=1
  cpu_shares: 5
  links:
    - db
db:
  image: postgres

使用例

個々のサービス拡張は、複数のサービスが共通の設定を持っている場合に役立ちます。以下の例では、Compose アプリはウェブ・アプリケーションとキュー・ワーカー(queue worker)の、2つのサービスを持ちます。いずれのサービスも同じコードベースを使い、多くの設定オプションを共有します。

common.yml ファイルでは、共通設定を定義します。

app:
  build: .
  environment:
    CONFIG_FILE_PATH: /code/config
    API_KEY: xxxyyy
  cpu_shares: 5

docker-compose.yml では、共通設定を用いる具体的なサービスを定義します。

webapp:
  extends:
    file: common.yml
    service: app
  command: /code/run_web_app
  ports:
    - 8080:8080
  links:
    - queue
    - db

queue_worker:
  extends:
    file: common.yml
    service: app
  command: /code/run_worker
  links:
    - queue

設定の追加と上書き

Compose は本来のサービス設定を、(訳者注:extends を使う時や、複数ファイルの読み込み時に)各所に対してコピー(引き継ぎ)します。もしも、設定オプションが元のサービスと、ローカル(直近の設定)のサービスの両方で定義された場合、ローカルの値は置き換えられるか、元の値を拡張します。

imagecommandmem_limit のような単一値のオプションは、古い値が新しい値に置き換わります。

# 元のサービス
command: python app.py

# ローカルのサービス
command: python otherapp.py

# 結果
command: python otherapp.py

buildimage の場合、ローカルでサービスの指定があれば、Compose は一方を破棄します。一方がオリジナルのサービスとして定義されている場合でもです。

image が build を置き換える例:

# 元のサービス
build: .

# ローカルのサービス
image: redis

# 結果
image: redis

build がイメージを置き換える例:

# 元のサービス
image: redis

# ローカルのサービス
build: .

# 結果
build: .

複数の値を持つオプションportsexposeexternal_linksdnsdns_searchtmpfs の場合、Compose は両方の値を連結します。

# 元のサービス
expose:
  - "3000"

# ローカルのサービス
expose:
  - "4000"
  - "5000"

# 結果
expose:
  - "3000"
  - "4000"
  - "5000"

environmentlabelvolumesdevices の場合、Compose はローカルで定義している値を優先して統合します。

# 元のサービス
environment:
  - FOO=original
  - BAR=original

# ローカルのサービス
environment:
  - BAR=local
  - BAZ=local

# 結果
environment:
  - FOO=original
  - BAR=local
  - BAZ=local