Kotlin+SpringBootでDocker環境構築
はじめに
前回こちらの記事で Kotlin+Spark の環境を作りました
今回はKotlin
+Spring Boot 3.0
の環境を Docker を利用して作成します。
情報が古いものが多く、3.0 をコンテナで利用している人がいなかったためまとめていきます
今回は以下の書籍の ToDo リスト作成を行うために作成したものになります
色々試行錯誤していて、途中で@Controller
が動かず、@RestController
は動くという謎の現象が発生して SpringBoot3.0、OpenJDK 17 にすることで落ち着きました
開発環境
Windows 11
VSCode
Ubuntu 20.04 (WSL2)
Docker 20.10.12
docker-compose version v2.2.3
git version 2.25.1
環境構築
まずは作業用ディレクトリを作成します
$ mkdir kotlin-spring-handson
$ cd kotlin-spring-handson
$ touch Dockerfile
$ touch docker-compose.yml
Dockerfile
を以下にします
FROM openjdk:17-alpine
ENV APP_ROOT /usr/src/app
WORKDIR $APP_ROOT
USER root
RUN apk add --no-cache curl \
zip \
libc6-compat \
bash
RUN ln -s /lib/libc.musl-x86_64.so.1 /lib/ld-linux-x86-64.so.2
RUN curl -s https://get.sdkman.io | bash
RUN bash -c " \
source "$HOME/.sdkman/bin/sdkman-init.sh" && \
sdk install kotlin 1.3.72 \
"
ここではOpenJDK 17
とKotlin 1.3.72
を入れています
docker-compose.yml
を以下にします
version: '3'
services:
app:
build: .
container_name: kotlin
working_dir: /app
volumes:
- .:/app
ports:
- "8080:8080"
command: ./gradlew bootRun
command の./gradlew bootRun
はSpring Boot
の実行コマンドになります
コンテナを起動したらサーバーが立ち上がるようにしています
次にこちらのサイトにアクセスします
SpringBoot を利用する際にはgradle
などの設定をしなくても済むようにテンプレートが用意されているので、作成してフォルダをコンテナにコピーして起動コマンドを叩くだけで手軽に利用することができます
テンプレート作成のための設定をします
項目 | 値 |
---|---|
Project | Gradle-Kotlin |
Language | Kotlin |
次に依存するライブラリを追加します
ADD DEPENDENCIES
をクリック
Spring Web
とThymeleaf
を追加します
GENERATE
を押すと ZIP ファイルをダウンロードするので解凍して、作業ディレクトリであるkotlin-spring-handson
にコピーします
.gradlew
という実行ファイルの権限を変更します
$ chmod +x ./gradlew
ここまでで必要な準備はできたので試しにサーバーを起動してみます
確認
以下のコマンドを実行して必要なファイルを作成します
$ touch ./src/main/kotlin/com/example/demo/HelloController.kt
$ touch ./src/main/resources/templates/index.html
それぞれ編集していきます
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
import org.springframework.web.bind.annotation.RestController
@Controller
class HelloController {
@GetMapping("/demo")
fun index(model: Model): String {
model.addAttribute("message", "Hello World!")
return "index"
}
}
<!DOCTYPE html>
<html xmlns="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8" />
<title>Index</title>
</head>
<body>
<span th:text="${message}"></span>
</body>
</html>
実際に起動します
$ docker-compose build
$ docker-compose up
up するとgradle
のインストールが行われた後、サーバーの起動が行われます
gradlew
を使っているようで、gradle がない環境でいい感じに設定してくれるようです
localhost:8080/demoにアクセスします
このような画面が表示されていれば成功です
おわりに
個人的に Kotlin のエラーがわかりづらいなと感じるくらいに、404 ページから解決するのができずに時間をとられてしまいました
どこが原因でエラーになっているのかはしっかりとログを確認するのはもちろん、view を変えてみたり慣れるまでは試行錯誤しないといけません
デバックがいままでやってきた言語の中では一番難しかったです
なんとか学習を進められそうなので良かったです。あとは ktor だけ
Discussion