はじめに
この実験では、docker buildx bake コマンドを効果的に使用し、単一の設定ファイルから複数の Docker イメージターゲットを管理・ビルドする方法を学びます。まず、異なる設定を持つ複数のビルドターゲットを定義した docker-bake.hcl ファイルを作成します。
実践的なステップを通じて、bake ファイルで定義された特定のターゲットのビルド、利用可能なターゲットの一覧表示、コマンドラインフラグを使用したターゲット設定の上書き、実際にビルドを実行せずにビルド設定をプレビューする方法を練習します。この実験では、複雑なプロジェクトにおける Docker イメージビルドのワークフローを効率化するスキルを身につけることができます。
複数ターゲットを含むシンプルな docker-bake.hcl ファイルを作成
このステップでは、基本的な docker-bake.hcl ファイルを作成します。このファイルは HCL(HashiCorp Configuration Language)形式を使用しており、Docker イメージの複数のビルドターゲットを定義できます。異なるビルド設定がある場合や、単一のソースから複数の関連イメージをビルドしたい場合に特に便利です。
まず、この実験の作業ディレクトリである ~/project に移動します。
cd ~/project
次に、nano エディタを使用して docker-bake.hcl という名前の新しいファイルを作成します。
nano docker-bake.hcl
nano エディタ内に以下の内容を貼り付けます。このファイルは my-app-dev と my-app-prod という 2 つのビルドターゲットを定義しています。各ターゲットは、使用する Dockerfile(Dockerfile)、ビルドコンテキスト(.)、および生成されるイメージのタグを指定します。
target "my-app-dev" {
dockerfile = "Dockerfile"
context = "."
tags = ["my-app:dev"]
}
target "my-app-prod" {
dockerfile = "Dockerfile"
context = "."
tags = ["my-app:prod"]
args = {
BUILD_ENV = "production"
}
}
このファイルの内容について:
target "my-app-dev"はmy-app-devという名前のターゲットを定義しますdockerfile = "Dockerfile"はコンテキスト内のDockerfileという名前のファイルを使用することを指定しますcontext = "."はビルドコンテキストをカレントディレクトリに設定しますtags = ["my-app:dev"]は生成されるイメージにmy-app:devというタグを割り当てますtarget "my-app-prod"はmy-app-prodという別のターゲットを定義します- こちらも
Dockerfileとカレントディレクトリをコンテキストとして使用します tags = ["my-app:prod"]はこのイメージにmy-app:prodというタグを割り当てますargs = { BUILD_ENV = "production" }はこのターゲットのビルド時に Dockerfile にBUILD_ENVというビルド引数とproductionという値を渡します
Ctrl + S を押してファイルを保存し、Ctrl + X を押して nano を終了します。
次に、bake ファイルが参照するシンプルな Dockerfile が必要です。同じディレクトリに Dockerfile という名前のファイルを作成します。
nano Dockerfile
Dockerfile に以下の内容を貼り付けます:
FROM alpine:latest
ARG BUILD_ENV=development
RUN echo "Building for environment: $BUILD_ENV"
CMD ["echo", "Hello from $BUILD_ENV environment!"]
この Dockerfile は alpine:latest ベースイメージを使用しています。デフォルト値が development のビルド引数 BUILD_ENV を定義しています。RUN 命令はビルドプロセス中にビルド環境を表示し、CMD 命令はこのイメージからコンテナが起動されたときに実行されるデフォルトのコマンドを設定します。
Dockerfile を保存して nano を終了します。
これで、2 つのターゲットを持つ docker-bake.hcl ファイルと、それと共に使用するシンプルな Dockerfile の作成が完了しました。
docker buildx bake で特定ターゲットをビルド
前のステップでは、my-app-dev と my-app-prod という 2 つのビルドターゲットを持つ docker-bake.hcl ファイルを作成しました。ここでは、docker buildx bake コマンドを使用して、このファイルで定義された特定のターゲットをビルドします。
docker buildx bake コマンドを使用すると、bake ファイルで定義された設定に基づいてイメージをビルドできます。コマンドの後にターゲット名を指定することで、Buildx にその特定のターゲットのみをビルドするよう指示します。
まず、my-app-dev ターゲットをビルドしてみましょう。~/project ディレクトリにいることを確認してください。
cd ~/project
次のコマンドを実行します:
docker buildx bake my-app-dev
このコマンドはカレントディレクトリの docker-bake.hcl ファイルを読み込み、my-app-dev という名前のターゲットをビルドします。Dockerfile で定義されたステップを含むビルドプロセスの出力が表示されます。
[+] Building 0.0s (0/0)
... (build output) ...
ビルドが完了したら、ローカルの Docker イメージをリスト表示して my-app:dev イメージが作成されたことを確認できます。
docker images
イメージのリストに dev タグが付いた my-app が表示されるはずです。
次に、my-app-prod ターゲットをビルドします。このターゲットには BUILD_ENV というビルド引数が production に設定されています。
docker buildx bake my-app-prod
出力を確認してください。ビルドプロセス中に Building for environment: production という行が表示され、ビルド引数が正しく渡されたことが確認できます。
[+] Building 0.0s (0/0)
... (build output showing "Building for environment: production") ...
このビルドが終了したら、再度イメージをリスト表示します。
docker images
これで、イメージのリストに my-app:dev と my-app:prod の両方が表示されるはずです。
docker buildx bake の後にターゲット名を指定することで、bake ファイルで定義された異なる設定を選択的にビルドできます。
bake ファイル内の利用可能なターゲットを一覧表示
これまでのステップで、docker-bake.hclファイルを作成し、そこから特定のターゲットをビルドしました。時には、実際にビルドせずに bake ファイルで定義されている利用可能なすべてのターゲットを確認したい場合があります。docker buildx bakeコマンドにはこれを実現する方法があります。
利用可能なターゲットを一覧表示するには、単純にターゲット名を指定せずにdocker buildx bakeコマンドを実行します。デフォルトでは、カレントディレクトリのdocker-bake.hclファイルを読み込み、定義されているすべてのターゲット名を表示します。
docker-bake.hclファイルがある~/projectディレクトリにいることを確認してください。
cd ~/project
次のコマンドを実行します:
docker buildx bake
以下のような出力が表示され、docker-bake.hclファイルで定義されたターゲットが一覧表示されます:
my-app-dev
my-app-prod
この出力は、docker-bake.hclファイルで定義した 2 つのターゲットmy-app-devとmy-app-prodの名前を示しています。これは bake ファイルで利用可能なビルド設定を簡単に把握する方法です。
このコマンドは、bake ファイルの構造を理解し、ビルド可能なターゲットを特定するのに役立ちます。
--set フラグを使用してターゲット設定を上書き
このステップでは、docker buildx bake コマンドの --set フラグを使用して、docker-bake.hcl ファイルで定義された特定ターゲットの設定を上書きする方法を学びます。これは、bake ファイル自体を変更せずにターゲットの設定を微調整する必要がある場合に便利です。
--set フラグを使用すると、ターゲットの特定の属性を上書きできます。構文は target_name.attribute=value です。
例えば、my-app-dev ターゲットをビルドする際に、タグを my-app:staging のように変更したい場合、--set フラグを使用して実現できます。
~/project ディレクトリにいることを確認してください。
cd ~/project
次のコマンドを実行します:
docker buildx bake my-app-dev --set my-app-dev.tags=my-app:staging
このコマンドでは:
my-app-devはビルド対象のターゲット名です--set my-app-dev.tags=my-app:stagingはmy-app-devターゲットのtags属性を上書きし、値をmy-app:stagingに設定します
ビルドプロセスの出力が表示されます。
[+] Building 0.0s (0/0)
... (build output) ...
ビルド完了後、ローカルの Docker イメージをリスト表示して、新しいタグのイメージが作成されたことを確認します。
docker images
これで、以前のステップの dev や prod タグに加えて、staging タグの my-app がリストに表示されるはずです。
ビルド引数など、他の属性も上書きできます。my-app-prod ターゲットをビルドする際に、BUILD_ENV 引数を qa に上書きしてみましょう。
docker buildx bake my-app-prod --set my-app-prod.args.BUILD_ENV=qa
ビルド出力を確認してください。Building for environment: qa と表示され、ビルド引数が正常に上書きされたことがわかります。
[+] Building 0.0s (0/0)
... (build output showing "Building for environment: qa") ...
--set フラグを使用すると、bake ファイルを変更することなく、コマンドラインから直接ビルドをカスタマイズする柔軟な方法が提供されます。
ビルドせずに最終設定を表示
この最終ステップでは、実際にビルドを実行せずに、docker buildx bake が特定のターゲットに使用する最終設定(--set フラグで適用された上書きを含む)を確認する方法を説明します。これは bake ファイルのデバッグや、ビルド前に有効な設定を理解するのに役立ちます。
docker buildx bake の --print フラグを使用すると、解決された設定を JSON 形式で出力できます。
~/project ディレクトリにいることを確認してください。
cd ~/project
my-app-dev ターゲットの設定を表示してみましょう。
docker buildx bake my-app-dev --print
このコマンドは、docker-bake.hcl ファイルから派生した my-app-dev ターゲットの設定を JSON 形式で出力します。
{
"target": {
"my-app-dev": {
"dockerfile": "Dockerfile",
"context": ".",
"tags": ["my-app:dev"]
}
}
}
次に、--set フラグが出力される設定にどのように影響するかを見てみましょう。タグを my-app:testing に上書きしながら、my-app-dev の設定を表示します。
docker buildx bake my-app-dev --set my-app-dev.tags=my-app:testing --print
出力を確認してください。JSON 出力の tags 属性に、上書きされた値が反映されているはずです。
{
"target": {
"my-app-dev": {
"dockerfile": "Dockerfile",
"context": ".",
"tags": ["my-app:testing"]
}
}
}
同様に、my-app-prod ターゲットの設定を表示し、そのビルド引数を上書きできます。
docker buildx bake my-app-prod --set my-app-prod.args.BUILD_ENV=staging --print
my-app-prod ターゲットの JSON 出力には、上書きされた BUILD_ENV 値を持つ args が表示されます。
{
"target": {
"my-app-prod": {
"dockerfile": "Dockerfile",
"context": ".",
"tags": ["my-app:prod"],
"args": {
"BUILD_ENV": "staging"
}
}
}
}
--print フラグは、時間のかかる可能性のあるビルドを開始する前に、bake ファイルの設定を検証し、上書きがどのように適用されるかを理解するための貴重なツールです。
まとめ
この実験では、単一の docker-bake.hcl ファイルで定義された複数の Docker イメージターゲットを管理・ビルドするために docker buildx bake コマンドを活用する方法を学びました。まず、各ターゲットが独自の Dockerfile、コンテキスト、タグ、ビルド引数を指定した基本的な docker-bake.hcl ファイルを作成しました。
次に、docker buildx bake <target_name> を使用して bake ファイルから特定のターゲットをビルドする方法、ファイル内の利用可能なすべてのターゲットをリスト表示する方法、--set フラグを使用してターゲット設定を動的に上書きする方法、そして実際にビルドを実行せずに --print フラグで最終的なビルド設定をプレビューする方法を検討しました。これらのステップは、複雑なマルチイメージビルドワークフローを効率化するための docker buildx bake の柔軟性と強力さを示しています。



