アプリがコンテナイメージで配布されていると利用者側は導入が楽で便利です。しかし Dockerfile を記述するのはそれなりに経験が必要で、試行錯誤してるうちかなりの時間が溶けてることもままあります。Dockerfile 書いた後もセキュリティスキャンとか、ベースイメージ更新など色々とやることがあります。
Cloud Native Buildpacks は、プログラミング言語・フレームワーク・ビルドツールなどのアプリ構成に応じてコンテナイメージをよしなに作ってくれるツールです。元々 Heloku で開発されて今は CNCF*1 のプロジェクトになっています。
ドキュメントにしたがって macOS にインストール。
Installing `pack` · Cloud Native Buildpack Documentation
$ brew tap buildpack/tap $ brew install pack
サンプルアプリの java-maven をビルドしてみます。
$ git clone https://github.com/buildpacks/samples $ pack build sample-app --path samples/apps/java-maven --builder cnbs/sample-builder:bionic
SpringBoot アプリのようで、 maven のビルドが延々と続きます。
Successfully built image sample-app
と表示されると成功です。Dockerfile は1行も書いていません。
ビルドされたコンテナを実行。
localhost:8080 で起動されたアプリにアクセスできます。
コンテナイメージを表示してみるとちゃんと sample-app のイメージがビルドされています*2。 ビルドに必要なイメージも付随してビルドされている模様です。
docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE cnbs/sample-stack-run bionic 660461c452f1 3 weeks ago 71.2MB cnbs/sample-builder bionic bcb0e9518efb 40 years ago 181MB sample-app latest 6c61aaf82fc8 40 years ago 301MB
プロジェクトの POM ファイルを解析してよしなにコンテナイメージをビルドしてくれました。SpringBoot アプリではもう自前で Dockerfile 書かなくてもよくなってるんですね。これはなかなかすごいです。
サンプルには、この java-maven の他に kotlin-gradle や ruby-bundler が含まれていていずれも同じようにコンテナを build / run できました。
Document によると Buildpack というモジュールにより、アプリのコードや構成を調査してフレームワークやビルド手順を検出しビルドする模様です。
Buildpack · Cloud Native Buildpack Documentation
このリポジトリでは、Java / .NET Core / Node.js / Go / PHP の Buildpack が公開されています。
GitHub から Node.js の サンプルを取ってきて Node.js の Buildpack を指定してイメージをビルドしてみます。
$ git clone git@github.com:contentful/the-example-app.nodejs.git $ cd the-example-app.nodejs $ pack build example-app-node:latest --builder gcr.io/paketo-buildpacks/builder:base : Successfully built image exapmple-app-node:latest
ビルド成功しました。docker run で実行してみます。
$ docker run --rm -p 3000:3000 example-app-node > example-contentful-theExampleApp-js@0.0.0 start /workspace > NODE_ENV=production node ./bin/www Listening on http://localhost:3000
無事起動しました。
Vue.js のアプリは依存関係のライブラリのビルドに Python が必要だったりしてこの Buildpack ではビルドできませんでしたが、今後は Dockerfile 書かなくてもビルド・デプロイできるアプリが増えていきそうです。
Buildpacks にはベースイメージの rebase など運用上便利そうな機能もあり期待が持てます。
Rebase · Cloud Native Buildpack Documentation
*1:Cloud Native Comupting Foundation https://www.cncf.io/
*2:40年前に作られたという謎の状態ですが。