Cloud Native Buildpack に入門:Maven プロジェクトをビルド

趣旨

maven wrapper を配置したマルチモジュールな Maven プロジェクトを pack cli でビルドしてみた

  • 指定条件
    • 成果物は 80 MB くらいの war ファイル
    • JDK は 1.8
    • Tomcat は 7.0.96
  • 結果
    • 314 MB くらいのイメージが作成された
    • そんなもんかな、という印象

Cloud Native Buildpack とは

buildpacks.io

アプリケーションコードから自動的にコンテナイメージを作成する仕組み、を標準化した仕様。

Dockerfile を書かなくてもよい、レイヤーを再利用できる、レイヤーを差し替えられるのがメリット。

アプリケーションとコンテナ実行基盤を疎結合にするツールとしてとてもよさそう。 コンテナ実行基盤を PaaS と同じように考えられるので。

やったこと

$ docker version
Client:
 Version:           19.03.1
 API version:       1.39 (downgraded from 1.40)
 Go version:        go1.12.7
 Git commit:        74b1e89e8a
 Built:             Wed Jul 31 15:18:18 2019
 OS/Arch:           windows/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.9
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.11.13
  Git commit:       039a7df9ba
  Built:            Wed Sep  4 16:55:50 2019
  OS/Arch:          linux/amd64
  Experimental:     false

$ pack build myapp --builder cloudfoundry/cnb:bionic --env BP_JAVA_VERSION="8.*" --env BP_BUILT_MODULE="webapp" --env BP_TOMCAT_VERSION="7.*"

$ docker images | grep myapp
myapp   latest   6342132d1392   18 seconds ago   314MB

--builder cloudfoundry/cnb:bionic

$ pack suggest-builders
Suggested builders:
        Cloud Foundry:     cloudfoundry/cnb:bionic         Ubuntu bionic base image with buildpacks for Java, NodeJS and Golang
        Cloud Foundry:     cloudfoundry/cnb:cflinuxfs3     cflinuxfs3 base image with buildpacks for Java, .NET, NodeJS, Python, Golang, PHP, HTTPD and NGINX
        Heroku:            heroku/buildpacks:18            heroku-18 base image with buildpacks for Ruby, Java, Node.js, Python, Golang, & PHP

--env BP_JAVA_VERSION="8.*"

cloudfoundry/openjdk-cnb の動作を制御する環境変数

  • 始めの方に配置されるプランで、Java のバージョンを指定できる。
  • ワイルドカード指定 (8.*) ができる。
  • 指定したバージョンの OpenJDK をダウンロードして配置してくれる。
  • このプランで指定された JAVA_HOME が後続のプランでも使われる。

--env BP_BUILT_MODULE="webapp"

cloudfoundry/build-system-cnb の動作を制御する環境変数

  • ビルドした成果物を探索するパス文字列パターンの先頭に指定される文字列。
  • mvnwgradlew が存在するならそれぞれのラッパースクリプトを使用するのでなんか面白い。
  • BP_BUILD_ARGUMENTS を指定するとラッパースクリプトの引数全体を上書きできる。

--env BP_TOMCAT_VERSION="7.*"

cloudfoundry/tomcat-cnb の動作を制御する環境変数

  • Tomcat のバージョンを指定できる。
  • ワイルドカード指定 (7.*) ができる。
  • 指定したバージョンの Apache Tomcat をダウンロードして配置してくれる。
  • 設定ファイルを追加したい場合は BP_TOMCAT_EXT_CONF_VERSION/BP_TOMCAT_EXT_CONF_URI/BP_TOMCAT_EXT_CONF_SHA256 と3つの環境変数を指定するらしい。
    • 指定する内容はアクセス可能な buildpack の情報らしい。
    • よく分からない。