フラグメント

Compose においては組み込み YAML 機能を利用して Compose ファイルをより適切かつ効率的に構築することができます。 アンカーやエイリアスを利用すれば、再利用可能なブロックを生成できます。 これは複数のサービスに共通する設定を見出したならば、大変便利に活用できます。 また再利用ブロックを持つことによって、潜在的な記述ミスを減らすこともできます。

アンカー (anchor) とは & 記号を使うものです。 この記号に続けてエイリアス名を記述します。 このエイリアスをその後の記述場面において * 記号を使うことで、アンカーに続けて設定した値を参照できるようになります。 &* という記号とエイリアス名の間に空白文字を含めないように留意してください。

一つの Compose ファイル内では、アンカーおよびエイリアスをいくつでも利用できます。

例1

volumes:
  db-data: &default-volume
    driver: default
  metrics: *default-volume

上の例においてはボリューム db-data においてアンカー default-volume が生成されています。 そして後段においてエイリアス *default-volume が再利用されていて、ボリューム metrics を定義しています。

アンカーの名前解決は 変数の補間 前に行われます。 したがってアンカーやエイリアスの指定の際に変数を用いることはできません。

例2

services:
  first:
    image: my-image:latest
    environment: &env
      - CONFIG_KEY
      - EXAMPLE_KEY
      - DEMO_VAR
  second:
    image: another-image:latest
    environment: *env

2 個以上のサービスに対して 1 つのアンカーを利用したい場合、エクステンション と組み合わせて利用すれば Compose ファイルをより保守しやすい形として実現できます。

例3

設定値を上書きして利用したい場合があります。 Compose では YAML マージタイプ に説明されているルールに基づいて実現可能です。

以下の例ではボリューム metrics の設定においてエイリアスが利用されています。 これによって繰り返しの記述を回避しつつ name 属性の上書き設定を行っています。

services:
  backend:
    image: example/database
    volumes:
      - db-data
      - metrics
volumes:
  db-data: &default-volume
    driver: default
    name: "data"
  metrics:
    <<: *default-volume
    name: "metrics"

例4

アンカーは値の追加設定を通じて拡張することもできます。

services:
  first:
    image: my-image:latest
    environment: &env
      FOO: BAR
      ZOT: QUIX
  second:
    image: another-image:latest
    environment:
      <<: *env
      YET_ANOTHER: VARIABLE
メモ

YAML マージ はマッピングに対してのみ適用できるものであり、シーケンスには適用できません。

上の例において環境変数は FOO: BAR というマッピング形式の文法を使って宣言しなければなりません。 つまりシーケンス形式の文法 - FOO=BAR を使った場合に、フラグメントを含めてしまうと不正な記述となります。