Docker社は、複雑なDockerイメージ ビルドを簡素化するために設計されたビルドオーケストレーションツールであるDocker Bakeの一般提供を発表した。Bake機能は数年前から実験段階にあり、ビルドステージとデプロイ環境を宣言的に定義することで、Dockerビルド構成の管理における一般的な課題に対処することを目的としている。
Docker Bakeは新しくリリースされたDocker Desktop 4.38の一部であり、Docker Buildx CLI Pluginでも利用できる。Docker Bakeの機能はDocker Composeと似ているが、実行環境ではなくビルドプロセスに焦点を当てている。DockerBakeは、異なるフラグや環境変数を必要とする複数のDockerビルドコマンドを管理する従来の方法に取って代わるもので、複数のイメージや様々な環境用のイメージをビルドするために、しばしば面倒な繰り返しが必要になる。歴史的には、これらは通常、エンジニアがアドホックに書いたシェルスクリプトだった。今、Docker Bakeを使えば、エンジニアはHCL、YAML、JSONを使って、これらのフラグや環境変数を記述するポータブルなコードを書くことができる。
Docker Bakeはまた、ビルド効率を向上させることを目的としたいくつかの主要な機能も導入している。これには、独立したビルドを自動的に並列化し、コンテキストの重複排除とインテリジェントキャッシュによって冗長な操作を排除することが含まれる。これらの最適化は、モノレポで作業するチームや、単一のソースリポジトリから関連する複数のDockerイメージを管理するチームに役立つ。
一般提供に向けて、Docker Bakeには多くの改良が加えられている:
-
コンテキスト転送の重複排除は、一般提供リリースで追加された重要な機能だ。以前は、ターゲットを同時にビルドする場合、ビルドコンテキストはターゲットごとに独立して読み込まれていたため、同じコンテキストが複数回転送される可能性があった。新バージョンでは、この重複排除が自動的に処理され、ビルド時間が短縮される可能性がある。
-
エンタイトルメントを導入することで、ビルドプロセス中のビルダー能力とリソースへのアクセスをより厳密に制御できるようになり、セキュリティも向上した。このシステムには、ホストネットワーキング、サンドボックス環境、ファイルシステム、SSHエージェントへのアクセスを制御するための特定のフラグが含まれるようになった。
-
Docker Bakeは、構成管理のためのコンポーザブル属性をサポートし、エンジニアが異なるターゲット間で組み合わせたり上書きしたりできる再利用可能な属性セットを定義できるようになった。これは、カンマ区切りの値を使用していた以前の使いにくい実装を改善するものだ。
-
このリリースでは、Terraformに見られるような変数検証機能も導入されている。この機能は、開発者が開発プロセスの早い段階で設定エラーを特定し、解決するのに役立つ。開発者は変数に対して複数の検証ルールを定義し、異なる変数間の依存関係を作成できるようになった。
-
Docker社は使いやすさを向上させるために、開発者がBake構成内で利用可能なターゲットと変数を素早く照会できる新しいリストオプションを追加した。この情報は、プログラムによるアクセスのために、標準形式とJSON形式の両方で出力できる。
このツールは、複数のプラットフォームや環境にまたがる複雑なビルド構成を管理する組織にとって、特に価値があると思われる。既存のdocker-compose.ymlファイルとのネイティブな互換性を提供するため、チームは現在のワークフローを維持しながら、徐々に高度な機能を採用していくことができる。
Docker BakeはDocker Build Cloudとも統合しており、クラウドインフラ全体でマトリックスのビルドを並列化することで、ビルド時間を短縮できる可能性がある。この機能は、リモートチームや限られたローカルコンピューティングリソースで作業する開発者にとって特に有益である。
Chainguardのブログ投稿で、Adrian Mouat氏はDocker Bakeの実用的な視点を提供し、シェルスクリプトやMakefileによるDockerビルド管理の代替としての役割を強調している。Mouat氏は、複雑なDockerビルドコマンドを、HashiCorp Configuration Language(HCL)、YAML、またはJSONを使用して、構造化された設定ファイルに変換する方法を示している。
target "default" { tags = ["amouat/multi-plat-test"] platforms = [ "linux/amd64", "linux/arm64", ] output = ["type=registry"] no-cache = true dockerfile = "cross.Dockerfile" context = "."}
Mouat氏は、ビルドターゲット間の継承によってコードの重複を削減できることを示しながら、Chainguard ImagesでBakeを使用する詳細な例を紹介している。例えば、単一の構成ファイルで、開発ビルド、マルチプラットフォームビルド、レジストリプッシュ用の別々のターゲットを定義ができ、それぞれのターゲットは前のターゲットのプロパティを継承して拡張する。
Docker Bakeのもっとも基本的な機能は、Dockerビルドをコード化することであり、これは迅速かつ簡単に行えます。
- Adrian Mouat氏
Mouat氏は続けて、実行時にレジストリの保存先を変更するなど、より柔軟な設定を行うために変数を使用する方法を説明する。同氏は、Bakeはマルチステージビルドやクロスプラットフォーム開発を含むシナリオで本当に役に立つと結論付けている。
BlueSkyへの投稿では、GroupBeesのMazlum Tosun氏がBakeプロジェクトでの初めての経験を披露している。
Bakeを使うと、従来のDockerビルドコマンドよりも構文が簡単で読みやすくなります。
- Mazlum Tosun氏
しかし、フラグや環境変数をHCLに移行することで、複雑さを取り除くというDockerの主張に批判的なコメントもある。
私の見解では、これらのフラグや環境変数はすべてそのままで、HCLファイルでさらに冗長に定義されるようになっただけです...
- Hacker Newsユーザー lopkeny12ko
しかし、他のユーザーもすでに大きな成果を上げている。ユーザーのmiiiiiike氏は、新しいBake contexts機能によって、複雑なビルドの依存関係を管理するための自作ツールを引退させることができたと説明している:
今朝、この1時間これで遊んでいたんだ。今朝、この1時間、このツールで遊んでみました。
- ハッカーニュースユーザー miiiiiike
Docker Bakeの導入したい組織は、Docker Desktopをバージョン4.38にアップデートするか、最新版のDocker Buildx CLIプラグインを実行することでアクセスできる。最初のBakeファイルを作成し、ツールの機能を調べたいチームのために、完全なドキュメントが用意されている。