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 には対応している
  • 入門ドキュメントは一通り読んでるし、自作できるのでは?

できたもの

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
    • ビルドフェーズで makegit を利用するために必要だった
    • Buildpack API には記載されているけど使い方とかが何もわからないという
    • paketobuildpacks/run:full-cnb などのイメージラベル io.buildpacks.stack.mixins に指定できる要素が並んでいるところを発見したりした
  • APIが明確でテストも書きやすい Go で作ったほうがいい
    • 既存の Buildpack はだいたい Go で書かれていたのだけど、本質的には Go じゃなくてもいい
    • 特にテスト容易性が高まるので Go で書いた方がいい