概要
Spring Boot + Kotlinで簡単なWebアプリケーションを作り、Dockerイメージにビルドする方法を記載します。
Webアプリケーションの開発
プロジェクトファイルの準備
spring initializrへアクセスし、以下の画面キャプチャのように設定してGENERATEボタンを押下することでプロジェクトを作成します。
- Gradle Project
- Kotlin
- Jar
- Java 11
- Dependencies
- Spring Web
- Thymeleaf
ダウンロードしたプロジェクトファイルをunzip
し、インストールしておいたIntelliJ IDEAのFile > Openから開きます。
コーディング
以下のKotlinファイルを作成します。
package com.example.demo
import org.springframework.stereotype.Controller
import org.springframework.ui.Model
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RequestMapping
@Controller
class Controller {
@GetMapping("/demo")
fun index(model: Model): String {
model.addAttribute("message", "Hello World!")
return "index"
}
}
上記のコードは/demo
のパスにアクセスした際に、return "index"
で指定したindex
.htmlのファイルが表示されるように紐づけています。
また、model.addAttribute
で指定したmessage
属性の値Hello World!
がindex.htmlへ渡されることになります。
続いて、index.htmlを作成しましょう。
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>Hello World!!</title>
</head>
<body>
<p th:text="${message}"></p>
</body>
</html>
上記HTMLファイルでは、<p th:text="${message}"></p>
の部分で、model.addAttribute
にて指定した属性値を取得しています。
Webアプリの起動
シェルにて以下のコマンドを実行することでWebアプリが起動します。
$ ./gradlew bootRun
なお、IntelliJのUIからもアプリを起動することは出来ます。
起動したWebアプリの画面
ブラウザにてlocalhost:8080/demo
にアクセスすることで以下の応答が得られます。
Dockerイメージのビルドおよび起動手順
Boot SpringのProject直下に以下のDockerfileを作成する。
※gradlew bootJar
ではなくgradlew build
を記述してしまうと、*-plain.jar
が生成されてしまいdocker build
に失敗します。
FROM adoptopenjdk/openjdk11:alpine
VOLUME /tmp
RUN mkdir /work
COPY . /work
WORKDIR /work
RUN /work/gradlew bootJar
RUN mv /work/build/libs/*.jar /work/app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/work/app.jar"]
シェルで以下のコマンドを実行することで、Dockerイメージの作成および実行が完了します。
$ docker build --no-cache -t <image name> .
$ docker run -p 8081:8080 <image name>
参考
- Dockerイメージのビルドでは、以下の記事を参考にさせてもらいました。以下の記事のやり方では
No such file or directory
のエラーによってDockerイメージのビルドに失敗してしまったため本記事ではその修正対応を行っております。
mv: can't rename '/work/build/libs/<project name>-plain.jar': No such file or directory
mv: can't rename '/work/build/libs/<project name>.jar': No such file or directory
The command '/bin/sh -c mv /work/build/libs/*.jar /work/app.jar' returned a non-zero code: 1