🔖

Kotlin+SpringBootでDocker環境構築

2022/12/13に公開

はじめに

前回こちらの記事で Kotlin+Spark の環境を作りました

https://zenn.dev/jinwatanabe/articles/fcc69d19039928

今回はKotlin+Spring Boot 3.0の環境を Docker を利用して作成します。
情報が古いものが多く、3.0 をコンテナで利用している人がいなかったためまとめていきます

今回は以下の書籍の ToDo リスト作成を行うために作成したものになります

https://www.amazon.co.jp/Kotlin-Webアプリケーション-新しいサーバサイドプログラミング-長澤-太郎/dp/4865940669/ref=sr_1_12?__mk_ja_JP=カタカナ&crid=1RBIG1ZHGPC72&keywords=kotlin&qid=1670916325&sprefix=ko%2Caps%2C658&sr=8-12

色々試行錯誤していて、途中で@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を以下にします

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 17Kotlin 1.3.72を入れています

docker-compose.ymlを以下にします

docker-compose.yml
version: '3'
services:
  app:
    build: .
    container_name: kotlin
    working_dir: /app
    volumes:
      - .:/app
    ports:
      - "8080:8080"
    command: ./gradlew bootRun

command の./gradlew bootRunSpring Bootの実行コマンドになります
コンテナを起動したらサーバーが立ち上がるようにしています

次にこちらのサイトにアクセスします
SpringBoot を利用する際にはgradleなどの設定をしなくても済むようにテンプレートが用意されているので、作成してフォルダをコンテナにコピーして起動コマンドを叩くだけで手軽に利用することができます

テンプレート作成のための設定をします

項目
Project Gradle-Kotlin
Language Kotlin

次に依存するライブラリを追加します
ADD DEPENDENCIESをクリック

Spring WebThymeleafを追加します

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

それぞれ編集していきます

/src/main/kotlin/com/example/demo/HelloController.kt
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"
    }
}
/src/main/resources/templates/index.html
<!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 がない環境でいい感じに設定してくれるようです

https://qiita.com/suin/items/266830c0ce37e823916d

localhost:8080/demoにアクセスします

このような画面が表示されていれば成功です

おわりに

個人的に Kotlin のエラーがわかりづらいなと感じるくらいに、404 ページから解決するのができずに時間をとられてしまいました

どこが原因でエラーになっているのかはしっかりとログを確認するのはもちろん、view を変えてみたり慣れるまでは試行錯誤しないといけません

デバックがいままでやってきた言語の中では一番難しかったです
なんとか学習を進められそうなので良かったです。あとは ktor だけ

参考

GitHubで編集を提案

Discussion