Compose ファイル構築リファレンス
Compose 仕様とは、複数のコンテナアプリケーションを定義するための、プラットフォームに中立な手法です。Compose の実装で焦点をあてているのは、ローカルマシン上でアプリケーションを実行する開発の利用例であり、ソースからアプリケーションを構築(および再構築)も明確にサポートしています。 Compose :ruby:`構築仕様 <Build specification>` により、Compose ファイル内の構築手順をポータブルな方法として定義できます。
定義
Compose Specification (仕様)は、サービス上で build (構築)サブセクションをオプションでサポートするように拡張されました。このセクションで定義するのは、サービス コンテナ イメージの :ruby:`構築 <build>` 要件を定義します。Compose ファイルの services サブセットのみ、 build サブセクションや image 属性をもとに作成されるその他を定義できます。サービスに build サブセクションがある場合、Compose 実装はソースからイメージを構築できるため、 Compose ファイルで対応するサービスの image 属性を見落とす処理も「 :ruby:`有効 <valid>` 」です。
構築の指定は、単一文字列でコンテクストのパスを指定するか、詳細な構築を定義するかのどちらかです。
前者の場合、パス全体を Docker コンテクストとして使用しますので、このコンテクストのルートで正しい Dockerfile を探し、docker build を実行します。コンテクストのパスは、絶対パスか相対パスです。なお、相対パスは Compose ファイルの親フォルダを基準にする必要があります。 Compose ファイルを持ち運びできるようにするには、絶対パスは避けるべきであり、 Compose 実装はユーザに対して :ruby:`警告すべきです <SHOULD>` 。
後者の場合、代替する Dockerfile の場所指定を含む、構築に対する引数を指定できます。これは、絶対パスも相対パスも利用できます。Dockerfile が相対パスの場合は、コンテキストのパスを基準にする :ruby:`必要があります <MUST>` 。 Compose ファイルを持ち運びできるようにするには、絶対パスは避けるべきであり、Dockerfile の代替パスに絶対パスが使われる場合、 Compose 実装はユーザに対して :ruby:`警告すべきです <SHOULD>` 。
イメージの一貫性
サービス定義に image 属性と build セクションの両方がある場合、取得したイメージがソースから構築したイメージと厳密に同じかどうかを、 Compose 実装では保証できません。ユーザから何らかの指示が明示されない限り、 Compose 実装は第一にイメージの取得を試し、レジストリ内にイメージがみつからない場合は、イメージをソースから構築します。Compose 実装はユーザからの要求によって、この挙動をカスタマイズするオプションを提供しても :ruby:構いません <MAY>` 。
構築イメージの公開
構築をサポートする Compose 実装は、構築したイメージのレジストリ :ruby:`送信 <push>`をオプションで :ruby:`サポートすべきです <SHOULD>` 。 image 属性を持たないイメージの送信を防ぐため、 Compose 実装はユーザに :ruby:`警告すべきです <SHOULD>` 。
YAML ファイル内でサービスに対する image 属性が明示的に宣言されていない場合、Compose 実装はサービスの image 属性を生成する仕組みを提供しても :ruby:`構いません <MAY>` 。このような挙動をする場合、 image 属性を持たないサービス イメージの送信を :ruby:`試みてはいけません <MUST NOT>` 。実際の生の YAML ファイルがイメージ属性を明示していなくても、Compose 実装は有効な image 属性を持っていると見なします。
説明例
以下の静的なサンプル アプリケーション例を通し、 Compose 仕様の概念を説明します。このサンプルは実用的ではありません。
services:
frontend:
image: awesome/webapp
build: ./webapp
backend:
image: awesome/database
build:
context: backend
dockerfile: ../backend.Dockerfile
custom:
build: ~/custom
ソースからサービス イメージを構築する時、このような Compose ファイルによって3つの Docker イメージが作成されます。
awesome/webappdocker イメージは、 Compose ファイルがある親フォルダ内のwebappサブディレクトリを、 docker 構築コンテクストとして使用します。このフォルダ内にDockerfileが無い場合は、エラーを起こします。awesome/databasedocker イメージは、 Compose ファイルがある親フォルダ内のwebappサブディレクトリを、 docker 構築コンテクストとして使用します。構築手順を定義するにあたり、backend.Dockerfileファイルを使います。このファイルはコンテクストパスに関連して検索されますので、つまり、このサンプルでは..が Compose ファイルの親フォルダとして基準となります(解決されます)ので、backend.Dockerfileは兄弟のようなファイルと言えます。customディレクトリで、ユーザの HOME (ホームディレクトリ)内を docker コンテクストとして使い、 Docker イメージを構築します。ポータブルではないパスが構築イメージで使われた場合、Compose 実装はユーザに警告します。
:ruby:`送信 <push>` すると、 awesome/webapp と awesome/database の両 Docker イメージが(デフォルトの)レジストリに :ruby:`送信 <push>` されます。 custom サービスイメージは image 属性を持たないためスキップされ、ユーザには、この属性が無いと警告します。
build 定義
build 要素は、 Docker イメージをソースから構築するために、 Compose 実装によって適用される設定情報のオプションを定義します。 build は、構築コンテクストへのパスを含む文字列か、詳細な構造のどちらかで指定します。
services:
webapp:
build: ./dir
この文字列の構文を使うと、 Compose ファイルの親フォルダからの相対パスとしてのみ、構築コンテキストを設定できます。このパスはディレクトリであり、かつ、 Dockerfile を含む必要があります。
あるいは、 build は以下のように定義されたフィールドを持つオブジェクトにもできます。
context(必須)
context は Dockerfile を含むディレクトリのパスか、 git リポジトリの url を定義します。
値が相対パスとして指定される場合、 Compose ファイルの場所からの相対パスと解釈する :ruby:`必要があります <MUST>` 。Compose ファイルがポータブルにならないのを防ぐため、構築コンテキストの定義で絶対パスが使われる場合、Compose 実装はユーザに対して警告が :ruby:`必要です <MUST>` 。
build:
context: ./dir
dockerfile
dockerfile は別の Dockerfile を指定できるようにします。相対パスは構築コンテキストを基準とする :ruby:`必要があります <MUST>` 。Compose ファイルがポータブルにならないのを防ぐため、 Dockerfile の定義で絶対パスが使われる場合、 Compose 実装はユーザに警告を出す :ruby:`必要があります <MUST>` 。
build:
context: .
dockerfile: webapp.Dockerfile
args
args は、たとえば Dockerfile の ARG 値のように構築の引数を指定します。
以下の Dockerfile を使います:
ARG GIT_COMMIT
RUN echo "Based on commit: $GIT_COMMIT"
args は Compose ファイルの build キー以下で GIT_COMMIT を定義できます。 args はマップかリストで指定できます。
build:
context: .
args:
GIT_COMMIT: cdc3b19
build:
context: .
args:
- GIT_COMMIT=cdc3b19
build の引数(args)の指定時に、値を省略できます。その場合、ユーザの操作によって構築時に値の指定が :ruby:`必要です <MUST>` 。そうしなければ、 Docker イメージの構築時に引数が設定されません。
args:
- GIT_COMMIT
ssh
ssh は、イメージ構築中にイメージビルダが :ruby:`使うべき <SHOULD>` SSH 認証を定義します(例:プライベート リポジトリのクローン時)。
ssh 属性の構文は、以下どちらかです。
default`` :ビルダを ssh-agent に接続します。
ID=path:ID と関連するパスをキーバリューで定義します。 PEM ファイルや、 ssh-agent ソケットのパスを指定できます。
シンプルな default 例:
build:
context: .
ssh:
- default # mount the default ssh agent
または
build:
context: .
ssh: ["default"] # mount the default ssh agent
任意の ID myproject にローカルの SSH 鍵のパスを使う場合:
build:
context: .
ssh:
- myproject=~/.ssh/myproject.pem
イメージビルダは構築期間中に SSH 鍵をマウントできます。具体例として、 BuildKit 拡張構文によって、 ID として設定された SSH 鍵をマウントすると、リソースへ安全なアクセスできます:
RUN --mount=type=ssh,id=myproject git clone ...
cache_from
cache_from は、イメージビルダがキャッシュの解決に :ruby:`使うべき <SHOULD>` ソースのリストを定義します。
キャッシュ場所の構文は、以下のグローバル形式 [NAME|type=TYPE[,KEY=VALUE]] に従う必要があります。シンプルな NAME は、実際には type=registry,ref=NAME と書く形式の省略形です。
Compose ビルダの実装は任意のタイプをサポートしても :ruby:`構いません <MAY>` 。Compose 仕様ではサポートしなければ :ruby:`ならない <MUST>` 正式な型を定義しています。
registryは、キーrefによって設定された OCI イメージから構築キャッシュを取得します。
build:
context: .
cache_from:
- alpine:latest
- type=local,src=path/to/cache
- type=gha
サポートされていないキャッシュは無視が :ruby:`必要で <MUST>` 、ユーザによるイメージ構築を妨げてはいけません。
cache_to
cache_to は、以後の構築時に構築キャッシュとして共有するために使えるよう、エクスポートする場所のリストを定義します。
build:
context: .
cache_to:
- user/app:cache
- type=local,dest=path/to/cache
:ruby:`キャッシュ対象 <cache target>` は cache_from で定義された同じ type=TYPE[,KEY=VALUE] 構文を使って定義できます。
サポートされていないキャッシュ対象は無視が :ruby:`必要で <MUST>` 、ユーザによるイメージ構築を妨げてはいけません。
extra_hosts
extra_hosts は構築時に追加のホスト名を割り当てます。 extra_hosts と同じ構文です。
extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"
Compose 実装は、コンテナのネットワーク設定内に、 IP アドレスとホスト名の一致するエントリを作成する :ruby:`必要があります <MUST>` 。つまり Linux の /etc/hosts に行を追加します。
162.242.195.82 somehost
50.31.209.229 otherhost
isolation
isolation は構築時のコンテナ分離技術を指定します。 isolation のように、サポートしている値はプラットフォーム固有です。
labels
labels は構築成果のイメージにメタデータを追加します。 labels はアレイ形式かマップ形式のどちらかです。
他のソフトウェアが使うラベルとの重複を避けるため、逆引き DNS 記法を :ruby:`使うべきです <SHOULD>` 。
build:
context: .
labels:
com.example.description: "Accounting webapp"
com.example.department: "Finance"
com.example.label-with-empty-value: ""
build:
context: .
labels:
- "com.example.description=Accounting webapp"
- "com.example.department=Finance"
- "com.example.label-with-empty-value"
shm_size
shm_size は、Docker イメージ構築時に割り当てる共有メモリの容量( Linux 上の /dev/shm パーティション )を設定します。設定はバイトを整数値で指定するか、 バイト値 の文字列で表現します。
build:
context: .
shm_size: '2gb'
build:
context: .
shm_size: 10000000
target
target は、マルチステージ Dockerfile 内で定義されている :ruby:`構築ステージ <build stage>` を定義します。
build:
context: .
target: prod
実装
buildX bake
参考
- Compose file build reference