Perl Carton Buildpack のプロトタイプで遊んでた
背景
- Heroku や Cloud Foundry などで利用されている Cloud Native Buildpacks という技術がある
- いわゆる S2C (Source Code to Container Image)
Dockerfile
の関門をスキップできる
- .NET Core/Go/Java/Node.js/Python/PHP/Ruby には対応している
- Getting Started - Paketo Buildpacks
- Perl には対応していない!
- 入門ドキュメントは一通り読んでるし、自作できるのでは?
できたもの
yujiorama/perl-carton-buildpack
- シェルスクリプトでいろいろ書かれている、テストのないプロトタイプ
- Perl アプリケーションのコンテナイメージを1コマンドで作成
- Carton に対応
.perl-version
によるバージョン指定に対応- Plack に少し対応(
plackup
する)
コンテナイメージ your-app
を作成する様子(一部)。
$ pack build your-app \ --builder paketobuildpacks/builder:full \ --buildpack yujiorama/perl-carton-buildpack \ --path /path/to/your-app full: Pulling from paketobuildpacks/builder Digest: sha256:4cfa401f11219ac10e8f756c244a6acc2d7cdd7aca42759a4e2aa616da7f1dfa Status: Image is up to date for paketobuildpacks/builder:full full-cnb: Pulling from paketobuildpacks/run Digest: sha256:4f113e8c504574b4f298ed7fc14dcfe25f347cf51a6bbd77e7765f896b668e60 Status: Image is up to date for paketobuildpacks/run:full-cnb ghcr.io/yujiorama/buildpacks/yujiorama_perl-carton-buildpack@sha256:ce9edb0104d2b03e29c0aef75e02e22d264d81285b34853fea360b1f4a43c00a: Pulling from yujiorama/buildpacks/yujiorama_perl-carton-buildpack 614925ba7a2b: Pull complete Digest: sha256:ce9edb0104d2b03e29c0aef75e02e22d264d81285b34853fea360b1f4a43c00a Status: Downloaded newer image for ghcr.io/yujiorama/buildpacks/yujiorama_perl-carton-buildpack@sha256:ce9edb0104d2b03e29c0aef75e02e22d264d81285b34853fea360b1f4a43c00a ===> ANALYZING Previous image with name "hello-world-plackup" not found ===> DETECTING yujiorama/perl-carton-buildpack 0.0.2 ===> RESTORING Restoring metadata for "yujiorama/perl-carton-buildpack:xbuild" from cache Restoring data for "yujiorama/perl-carton-buildpack:xbuild" from cache Restoring data for SBOM from cache ===> BUILDING ---> Perl-Carton Buildpack ---> Configure xbuild layer
やったこと
所感
- 標準化された仕様にたどり着くまでが長かった
- 最初に Reference を読み飛ばして進めたのが敗因
- 最終的に buildpacks/spec を読めばいいことが分かっていろいろ捗った
- 既存の Buildpack が使用しているAPIバージョンは必ずしも最新化されておらず、見るものによって仕様の記述と合わなくて混乱していたのも敗因
- 具体例のない仕様に手こずった
- 特に buildpacks/rfcs - 0031-bionic-mixins
- ビルドフェーズで
make
やgit
を利用するために必要だった - Buildpack API には記載されているけど使い方とかが何もわからないという
paketobuildpacks/run:full-cnb
などのイメージラベルio.buildpacks.stack.mixins
に指定できる要素が並んでいるところを発見したりした
- APIが明確でテストも書きやすい Go で作ったほうがいい
- 既存の Buildpack はだいたい Go で書かれていたのだけど、本質的には Go じゃなくてもいい
- 特にテスト容易性が高まるので Go で書いた方がいい