Cloud Native Buildpacksでextensionを諦めつつrun-imageを拡張する
要望
Cloud Native Buildpacks の Builder が提供するイメージに含まれないツールを使いたい
例えば ImageMagick. いや ImageMagick くらい入っているか。例えば ffmpeg. さすがに普通入ってなさそう。
今回はそういうツールを使いたいと思った場合の対処方法を調べてみた。
まとめ
- 利用したい Builder の Run image の base image に対してDockerfile で追加設定を行い、
docker build
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 はどうも無視してるっぽいので、
今回は諦めです。