✌️

Spring BootのbootBuildImageでベースのイメージを差し替える

2022/09/05に公開

概要

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.

参考

https://radiochemical.hatenablog.com/entry/2020/12/16/170413

https://spring.pleiades.io/spring-boot/docs/current/gradle-plugin/reference/htmlsingle/#build-image.customization

https://buildpacks.io/docs/operator-guide/create-a-stack/

Discussion