
Dockerfile をいじくり回すのにうんざりしたことはありませんか? Dockerfile と Docker イメージは、再利用可能なコンテナー化されたデプロイメント用にアプリをパッケージ化する優れた方法です。ただし、Dockerfile の作成と管理は必ずしも直感的ではなく、アプリに機能を追加するために使用できる時間を奪われます。そこで Cloud Native Buildpacks の出番です。Buildpacks は、アプリの実行に必要なものをすべてまとめて Open Container Initiative (OCI) イメージにまとめるために存在します。Dockerfile は必要ありません。
使いやすく、時間と手間を省くコンテナ ビルド プロセスを必要としているすべての開発者にとって、Cloud Native Buildpacks はまさに探し求めていたソリューションかもしれません。興味がありますか? 詳しくお話ししましょう。
大まかに言えば、ビルドパックはアプリケーション コードを取得し、ビルド プロセスを通じて実行可能にします。次に、 Cloud Native ビルドパックはアプリケーションのソース コードを取得して、実行可能で再現可能な OCI イメージに変換し、イメージのセキュリティ、パフォーマンスの最適化、コンテナーのビルド順序に関する要件を実装します。これは、必要な Dockerfile を正確に持っているようなものです。ただし、Dockerfile を作成する必要はありません。
ほとんどの開発者は Dockerfile を作成できますが、Docker やインフラストラクチャの専門家はほとんどいません。Web 上で見つかったコード スニペットから寄せ集められた Dockerfile を持つアプリが多すぎます。多くの場合、Copilot、Stack Overflow、ChatGPT の寄せ集めです。Dockerfile のエラーにより、アプリケーションの安全性が低下し、パフォーマンスが低下する可能性があります。
Cloud Native Buildpacks はこの負担を引き受け、各言語またはフレームワークのベストプラクティスを自動的に適用します。ビルダーは任意の数のビルドパックを利用し、必要なビルドパックを自動的に検出して適用し、アプリケーションを構築できます。Heroku のビルダーが現在サポートしているビルドパックは次のとおりです。
$ pack builder inspect heroku/builder:24 Inspecting builder: heroku/builder:24 REMOTE: Description: Ubuntu 24.04 AMD64+ARM64 base image with buildpacks for .NET, Go, Java, Node.js, PHP, Python, Ruby & Scala. ... Buildpacks: ID NAME VERSION heroku/deb-packages Heroku .deb Packages 0.0.3 heroku/dotnet Heroku .NET 0.1.10 heroku/go Heroku Go 0.5.2 heroku/gradle Heroku Gradle 6.0.4 heroku/java Heroku Java 6.0.4 heroku/jvm Heroku OpenJDK 6.0.4 heroku/maven Heroku Maven 6.0.4 heroku/nodejs Heroku Node.js 3.4.5 heroku/nodejs-corepack Heroku Node.js Corepack 3.4.5 heroku/nodejs-engine Heroku Node.js Engine 3.4.5 heroku/nodejs-npm-engine Heroku Node.js npm Engine 3.4.5 heroku/nodejs-npm-install Heroku Node.js npm Install 3.4.5 heroku/nodejs-pnpm-engine Heroku Node.js pnpm Engine 3.4.5 heroku/nodejs-pnpm-install Heroku Node.js pnpm install 3.4.5 heroku/nodejs-yarn Heroku Node.js Yarn 3.4.5 heroku/php Heroku PHP 0.2.0 heroku/procfile Heroku Procfile 4.0.0 heroku/python Heroku Python 0.23.0 heroku/ruby Heroku Ruby 5.0.1 heroku/sbt Heroku sbt 6.0.4 heroku/scala Heroku Scala 6.0.4
PaketoやGoogle Cloudなどの他のビルダーも、さまざまなビルドパックを提供しています。全体として、Cloud Native Buildpacks エコシステムは成長し、成熟しており、開発者にとっては喜ばしいことです。
Heroku に詳しい方は、すでにビルドパックのエクスペリエンスを楽しんでいらっしゃるでしょう。git git push heroku main
を使用すると、Dockerfile を必要とせずに Heroku に直接デプロイできます。Cloud Native Buildpacks は Heroku ビルドパックのエクスペリエンスに基づいて構築され、かつてはベンダー固有の実装であったものを、あらゆるクラウド プラットフォームで使用できる CNCF 標準に変換します。
つまり、 Cloud Native Buildpacks を使用すると、開発者は次のことが可能になります。
素晴らしいですね。これらすべての利点を踏まえて、Cloud Native Buildpacks を使用することでメリットが得られる具体的なケースをいくつか見てみましょう。
通常 Dockerfile が必要となるあらゆる場所で、ビルドパックを使用できます。例:
注目すべき点が 1 つあります。ビルドパックは宣言型ですが、Dockerfile は手続き型です。ビルドパックでは、特定のアプリケーションを特定のビルダーまたはビルドパックでビルドすることを宣言するだけです。対照的に、Dockerfile では、アプリケーションをビルドするためにコマンドとそれらのコマンドを実行する順序を定義する必要があります。そのため、ビルドパックは現在、Dockerfile 内で利用できるレベルの構成可能性を提供していないため、より高度なユースケースのニーズを満たさない可能性があります。
とはいえ、Cloud Native Buildpacks にはベンダー ロックインはありません。OCI イメージをビルドするだけです。Buildpack で利用できるものよりも多くのカスタマイズとオプションが必要ですか? ビルド パイプラインのビルダーを Dockerfile と標準の OCI イメージ ビルドに置き換えるだけで、準備完了です。
Cloud Native Buildpacks の使用方法を簡単に説明しましょう。
アプリ開発者としてビルドパックを使い始めるには、まずPack CLI ツールをインストールする必要があります。このツールを使用すると、ビルドパックを使用してアプリケーションをビルドできます。ご使用のオペレーティング システムのインストール手順に従ってください。
さらに、まだインストールしていない場合は、ビルダーがアプリをビルドし、イメージを実行するためにDocker デーモンが必要になります。これら 2 つのツールをインストールしたら、準備完了です。
pack
ツールにアクセスしたら、サンプル アプリケーションを構築して試してみることができます。これを Next.js アプリケーション内で実行します。ビルドパックをテストするためのサンプル アプリケーションが必要ですか? Next.js サンプル アプリケーションの完全なディレクトリはこちらです。お手持ちのアプリケーションを試すこともできます。
アプリケーションの準備ができたら、まずはパック ツールが提案するビルダーを確認します。シェルでアプリ ディレクトリに移動し、次のコマンドを実行します。
$ pack builder suggest
私の Ubuntu インストールでは、Next.js アプリケーションに対して、 pack
ツールが次のビルダーを提案します。
提案された Heroku ビルドパック ( heroku/builder:24
) を試してみましょう。これを使用するには、次のコマンドを実行します。
$ pack build my-app --builder heroku/builder:24
ビルド時間はアプリケーションのサイズによって異なります。私の場合、アプリケーションのビルドには 30 秒かかりました。これで、イメージの準備ができました。次のようにしてイメージを実行できます。
$ docker run -p 3000:3000 my-app
結果は次のようになります。
これで完了です。Dockerfile を使用せずに、Next.js アプリケーションの OCI イメージを正常に構築できました。
ビルドパック内で何かを構成する必要がある場合はどうすればよいでしょうか。この場合は、ビルダーによって選択されたビルドパックを参照します。たとえば、私の Next.js アプリの場合、ログを見ると、ビルダーがnodejs-engineとnodejs-yarn の2 つのビルドパックを選択したことがわかります。
ビルドパックで使用される yarn バージョンを指定したいとします。まず、 nodejs-yarn ビルドパックの Readmeにアクセスし、 packageManager
キーを使用してpackage.json
ファイルで yarn バージョンを指定できることを確認します。ファイルを次のように変更します。
{ "packageManager": "yarn@1.22.22" }
そこからは、もう一度pack build my-app --builder heroku/builder:24
実行するだけです。
Cloud Native Buildpacks は、アプリケーション用のコンテナ イメージを作成するための新しい方法です。Dockerfile が不要になることで、アプリケーションのパッケージ化とデプロイがこれまで以上に高速化されます。また、標準のコンテナ イメージを作成するため、ベンダー ロックインはありません。
Cloud Native Buildpacks は多くのプラットフォームでプレビュー段階にあります。つまり、機能セットは軽量ですが、急速に成長しています。Cloud Native Buildpacks をオープンソース化した Heroku も、これを次世代プラットフォームに導入する予定です。Cloud Native Buildpacks がクラウド プラットフォーム コミュニティ全体で安全かつ迅速なアプリケーション展開をどのように実現するかを見るのが楽しみです。