Dockerfile 記述不要の Cloud Native Buildpacks を使ってみる

アプリがコンテナイメージで配布されていると利用者側は導入が楽で便利です。しかし Dockerfile を記述するのはそれなりに経験が必要で、試行錯誤してるうちかなりの時間が溶けてることもままあります。Dockerfile 書いた後もセキュリティスキャンとか、ベースイメージ更新など色々とやることがあります。

Cloud Native Buildpacks は、プログラミング言語・フレームワーク・ビルドツールなどのアプリ構成に応じてコンテナイメージをよしなに作ってくれるツールです。元々 Heloku で開発されて今は CNCF*1 のプロジェクトになっています。

buildpacks.io

ドキュメントにしたがって 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行も書いていません。

ビルドされたコンテナを実行。

f:id:kondoumh:20200525235151p:plain

localhost:8080 で起動されたアプリにアクセスできます。

f:id:kondoumh:20200525234247p:plain

コンテナイメージを表示してみるとちゃんと 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.com

GitHub から Node.js の サンプルを取ってきて Node.js の Buildpack を指定してイメージをビルドしてみます。

github.com

$ 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年前に作られたという謎の状態ですが。