Spring Bootをコンテナで動かしたい
皆さん、こんにちは。技術開発グループのn-ozawanです。
毎年10月の第4週には、長野県と静岡県で県境をかけた綱引き合戦が行われます。
本題です。
以前、Next + Expressをイメージ化する方法を取り上げました。せっかくなのでSpring Bootで作成したアプリケーションをイメージ化する方法を紹介します。とはいえ、特に語ることがないほど、すごい簡単です。
目次
Spring Boot プロジェクトのコンテナ化
プロジェクトの準備
Spring Bootプロジェクトを用意します。環境はGradleです。Spring Bootのプロジェクトは、公式がGitHubで公開していますので、それをダウンロードします。
ダウンロードしたらgradlew
に実行権限を付与します。
chmod +x gradlew
SpringBootを実行します。
./gradlew bootRun
curl
でリクエストを送信して返答があれば成功です。
curl http://localhost:8080
Greetings from Spring Boot!
方法①:bootBuildImageでイメージを作成する
イメージを作成する方法は大きく2通りあります。その内の1つはbootBuildImageタスクを実行する方法です。以下のコマンドを実行します。
./gradlew bootBuildImage --imageName=spring-boot-app
上記のコマンドで、プロジェクトのビルドからイメージの作成までを行ってくれます。Dockerfileは不要です。
方法②:Dockerfileでイメージを作成する
もう1つの方法はDockerfileからイメージを作成する方法です。内容は非常にシンプルで、必要最小限であれば4行で済みます。
FROM openjdk:21-jdk
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
引数にJAR_FILE
を受け取るようにしています。もし、JAR_FILE
を受け取らなかった場合は、デフォルト値としてtarget/*.jar
を参照します。処理内容としては、jarファイルをイメージにコピーして、そのjarファイルを実行しているだけです。
プロジェクトのルートにDockerfileを格納したら、以下のコマンドによりイメージを作成します。
./gradlew build && docker build --build-arg JAR_FILE=build/libs/spring-boot-0.0.1-SNAPSHOT.jar -t spring-boot-app .
引数にJAR_FILE
を指定することにより、イメージにコピーするjarファイルを指定します。
動作確認をする
方法①と②とともに、以下のコマンドでコンテナを起動します。
docker run -p 8080:8080 -it spring-boot-app
正常にコンテナが動いているか確認してみましょう。
curl http://localhost:8080
Greetings from Spring Boot!
おわりに
方法①の「bootBuildImageでイメージを作成する」方法では、Cloud Native Buildpacks (CNB)と呼ばれるツールが使われています。CNBは、Dockerfileを書かずに、クラウドでの動作に最適化されたコンテナのイメージを作成するツールです。Dockerfileを知らなくても最適化されたイメージが作成できるなんて、すごい便利な時代になりましたね。
ではまた。