Spring BootのbootBuildImageでベースのイメージを差し替える
概要
Spring BootのプロジェクトでDockerイメージを生成する際、Spring Bootの機能でCloud Native Buildpacksを使ってビルドすることができる。
一方で、デフォルトでは実行時のイメージがビルダーの指定のものになってしまう。このままではベースのイメージとして例えば社内で共通の物を使用している場合などに不都合である。
そこでこの記事ではベースのイメージを差し替える方法を述べる。
差し替え方法
以下のようなDockerfileからベースのイメージを元にしたイメージを生成する。
FROM ${ベースにしたいイメージ} as base
ENV CNB_USER_ID=1000
ENV CNB_GROUP_ID=1000
ENV CNB_STACK_ID="io.buildpacks.stacks.bionic"
LABEL io.buildpacks.stack.id="io.buildpacks.stacks.bionic"
RUN groupadd cnb --gid ${CNB_GROUP_ID} && \
useradd --uid ${CNB_USER_ID} --gid ${CNB_GROUP_ID} -m -s /bin/bash cnb
FROM base as run
USER cnb
そして、ビルド時に引数を渡す。
./gradlew bootBuildImage --runImage ${作成したイメージ}
解説
解説が必要そうな部分についてそれぞれ述べる。
ユーザ作成
(前略)
ENV CNB_USER_ID=1000
ENV CNB_GROUP_ID=1000
(中略)
RUN groupadd cnb --gid ${CNB_GROUP_ID} && \
useradd --uid ${CNB_USER_ID} --gid ${CNB_GROUP_ID} -m -s /bin/bash cnb
(中略)
USER cnb
一応rootでも動くことは確認したが、buildpacks.ioの資料によれば以下のように書かれている。
The given user MUST NOT be a root user and have it’s home directly writeable. CNB_GROUP_ID is the
primary GID of the above user.
参考コードも存在したためそのまま用いた。
スタックID
ENV CNB_STACK_ID="io.buildpacks.stacks.bionic"
LABEL io.buildpacks.stack.id="io.buildpacks.stacks.bionic"
実行時イメージのみを差し替える場合、スタックIDが指定されたものでないとbootBuildImageでビルドできなかったため、デフォルトのものと同じ値を指定した。
buildpacks.ioの資料によれば以下のようにあるため、動作確認はきちんとした方が良いかもしれない。
The stack identifier implies compatibility with other stacks of that same identifier. For
instance, a custom stack may use io.buildpacks.stacks.bionic as its identifier so long as it will
work with buildpacks that declare compatibility with the io.buildpacks.stacks.bionic stack.
参考
Discussion