IK.AM

@making's tech note


Tanzu Application PlatformにデプロイするSpring BootアプリをDockerfileでビルドする

🗃 {Dev/CaaS/Kubernetes/TAP}
🏷 Kubernetes 🏷 Docker 🏷 Tanzu 🏷 TAP 🏷 Spring Boot 
🗓 Updated at 2023-08-01T10:19:45Z  🗓 Created at 2023-08-01T10:17:37Z   🌎 English Page

⚠️ 本記事の内容はVMwareによってサポートされていません。 記事の内容で生じた問題については自己責任で対応し、 VMwareサポート窓口には問い合わせないでください

Tanzu Application Platformではアプリケーションのコンテナイメージを作成する際にデフォルトでCloud Native Buildpacksが使用されますが、 Dockerを使ってDockerイメージをビルドすることもできます。

Spring Bootのアプリに対する Dockerfile の書き方の推奨は次のドキュメントに記載されています。

https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#container-images.dockerfiles

ドキュメントに記載されているDockerfileはjarがビルド済みの状態を想定していますが、Tanzu Application Platform上ではソースコードだけがあるので、 Docker build時にソースコードからjarファイルをビルドする必要があります。また、実行時はrunAsUser: 1000が設定されるので、uid 1000のユーザーに切り替えておきます。

以上を踏まえて、Dockerfileを書くと次のようになります。

FROM eclipse-temurin:17-jdk as builder
WORKDIR application
ADD ./.mvn .mvn/
ADD ./mvnw mvnw
ADD ./pom.xml pom.xml
ADD ./src src/
RUN ./mvnw -V clean package -DskipTests --no-transfer-progress && \
    cp target/*.jar application.jar && \
    java -Djarmode=layertools -jar application.jar extract

FROM eclipse-temurin:17-jre
ARG USERNAME=spring
ARG GROUPNAME=spring
ARG UID=1000
ARG GID=1000
WORKDIR application
RUN groupadd -g $GID $GROUPNAME && \
    useradd -m -s /bin/bash -u $UID -g $GID $USERNAME
USER $USERNAME
COPY --from=builder application/dependencies/ ./
COPY --from=builder application/spring-boot-loader/ ./
COPY --from=builder application/snapshot-dependencies/ ./
COPY --from=builder application/application/ ./
ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"]

デプロイする際は次のように --param dockerfile=<レポジトリ上のDockerfileのパス> を指定すれば Dockerfile を使ったコンテナイメージのビルドが行われます。

tanzu apps workload apply rest-service \
  --app rest-service \
  --git-repo https://github.com/making/rest-service \
  --git-branch main \
  --type web \
  --param dockerfile=./Dockerfile \
  -n demo \
  -y

Paketo Buildpacks / Tanzu Buildpacksでコンテナイメージを作った時と異なり、JVMのメモリサイズの設定が自動で行われないので、 必要に応じて実行時の環境変数JAVA_TOOL_OPTIONSでJVMの設定をする必要がある点に注意が必要です。


✒️️ Edit  ⏰ History  🗑 Delete