Cloud Native Buildpacksでextensionを諦めつつrun-imageを拡張する

要望

Cloud Native Buildpacks の Builder が提供するイメージに含まれないツールを使いたい

例えば ImageMagick. いや ImageMagick くらい入っているか。例えば ffmpeg. さすがに普通入ってなさそう。

今回はそういうツールを使いたいと思った場合の対処方法を調べてみた。

まとめ

  1. 利用したい Builder の Run image の base image に対してDockerfile で追加設定を行い、docker build
  2. pack build --run-image <1でできたイメージ> でコンテナイメージを作る

Cloud Native BuildpacksのBuild imageとRun image

まず前提として押さえておくべき知識について。

今回考えているのは

実行時に、標準的でないツールを導入したい

ということなので、

Build · Cloud Native Buildpacks

で言うところの app image の中に「標準的でないツール」を導入したい、という要望である。

すると工夫が必要なのは Run imageということになる。

Run imageに変更を加える手順

run imageの拡張については非常にコンパクトだが、以下がまとまっている。

ビルドと実行のイメージを構成する  |  Buildpacks  |  Google Cloud

1. run imageのbase imageからdocker buildで拡張する

  • Builder の提供している run-image 用の base image を FROM に持つ Dockerfile を書いて、そこに必要な変更を加える
  • USER の切り替えに注意。例えば Heroku Builder を使う場合は USER root で変更を加えたあと、USER heroku に戻す必要があった。
  • run-image の base は Builder ごとに違うのでそれぞれで確認すること

で、docker build を実行する。

例えば Heroku Builder の Heroku-22 イメージに対して ffmpeg を追加したい場合は以下のような Dockerfile になる

FROM heroku/heroku:22-cnb

USER root

RUN apt-get update && \
  apt-get install -y ffmpeg

USER heroku

2. できたimageをpack build時に利用する

こうゆうこと

$ pack build -B <builder> --run-image <さっき作ったimage>

あれ、結局Dockerfile書いてない?

そうなんです。

ということは想定外の入力が入る可能性のある実行環境でこの run-image を利用する場合は、常にフレッシュで安全な状態を保つように独自に CI/CD で build し続けておく必要があります。

諦めたImage Extension

実は最初

Create an extension · Cloud Native Buildpacks

を参考に CNB image extensions という考え方でなんとかなるんじゃないかと思ったんだけど、全然情報はないし、サンプルのリポジトリを見ても分からないしで、諦めました。

Heroku の Builder を利用したところ、

failed to build: executing lifecycle: builder has an order for extensions which is not supported when using the creator

と言われて、調べてもさっぱり情報が見つからず、Google の Builder はどうも無視してるっぽいので、

今回は諦めです。

More