docker buildx bake コマンドで複数ターゲットをビルドする方法

DockerDockerBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、docker buildx bake コマンドを効果的に使用し、単一の設定ファイルから複数の Docker イメージターゲットを管理・ビルドする方法を学びます。まず、異なる設定を持つ複数のビルドターゲットを定義した docker-bake.hcl ファイルを作成します。

実践的なステップを通じて、bake ファイルで定義された特定のターゲットのビルド、利用可能なターゲットの一覧表示、コマンドラインフラグを使用したターゲット設定の上書き、実際にビルドを実行せずにビルド設定をプレビューする方法を練習します。この実験では、複雑なプロジェクトにおける Docker イメージビルドのワークフローを効率化するスキルを身につけることができます。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/DockerfileGroup(["Dockerfile"]) docker/ImageOperationsGroup -.-> docker/images("List Images") docker/DockerfileGroup -.-> docker/build("Build Image from Dockerfile") subgraph Lab Skills docker/images -.-> lab-555044{{"docker buildx bake コマンドで複数ターゲットをビルドする方法"}} docker/build -.-> lab-555044{{"docker buildx bake コマンドで複数ターゲットをビルドする方法"}} end

複数ターゲットを持つシンプルな 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-devmy-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!"]

この Dockerfilealpine:latest ベースイメージを使用しています。デフォルト値が development のビルド引数 BUILD_ENV を定義しています。RUN 命令はビルドプロセス中にビルド環境を表示し、CMD 命令はこのイメージからコンテナが起動されたときに実行されるデフォルトのコマンドを設定します。

Dockerfile を保存して nano を終了します。

これで、2 つのターゲットを持つ docker-bake.hcl ファイルと、それと共に使用するシンプルな Dockerfile の作成が完了しました。

docker buildx bake を使用した特定ターゲットのビルド

前のステップでは、my-app-devmy-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:devmy-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-devmy-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:stagingmy-app-dev ターゲットの tags 属性を上書きし、値を my-app:staging に設定します

ビルドプロセスの出力が表示されます。

[+] Building 0.0s (0/0)
... (build output) ...

ビルド完了後、ローカルの Docker イメージをリスト表示して、新しいタグのイメージが作成されたことを確認します。

docker images

これで、以前のステップの devprod タグに加えて、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 の柔軟性と強力さを示しています。