DockerでSpring Boot環境構築（2021年1月版）

Spring Bootを触れる環境を急遽準備する必要ができたので、作成したときの手順とかちょっとした考え事まとめ。

# 0.参考記事
Docker × Spring Boot環境構築
https://qiita.com/A-Kira/items/beaf79a0d39d9839e61e

ほとんどこの通りに実行しようとして、時間経過による変更値があったので、その周りを書き足した程度の提灯記事です。並行して読むほうが良いと思います。

# 1.筆者環境
- Windows 10 Professional(20h4)
- VSCode
- Git Bash
- Docker Desktop

このあたりの詳細については割愛します（元記事はMacだったのですがまぁ問題ないでしょう）

# 2.自力で作成するファイルを作成
自動生成されるファイルが多いので、元記事を端折って手動で編集するファイルだけ取り上げます。

## docker-compose.yml

```docker-compose.yml
version: '3.8'
services:
  java:
    image: openjdk:15-slim
    ports:
      - 8080:8080
    tty: true
    volumes:
      - ./server:/srv:cached
    working_dir: /srv
```
先にさっくり書いてしまうと、元記事との違いは
- versionを3.6→3.8（ここはほぼ影響なし）
- imageのバージョンを14→15（大事）

後述しますが、initializrのバージョンが14から15に変わっているので、ここを元記事のままで続けるとgradleがコケます。

一応筆者個人としては、dockerhubに"openjdk:15-slim"があることを確認しての記載をしましたよという、ぶっ放し（格ゲー文脈）で書き換えたわけではないという申し訳程度のフォローを入れておきます。
https://hub.docker.com/r/amd64/openjdk/

##  Gradleプロジェクトファイル
元記事と同様、[spring initializr](https://start.spring.io/)で作成し、【プロジェクトディレクトリ】/server下に展開します。

ただし、バージョン周りが当時と変わっているので、その違いのみ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17827/38f34c04-9b0f-e1f2-feff-af9e9d5dd9e5.png)

- （先に書いてますが）Javaの選択地に14がなく、最新は15になっている
- Spring Bootの選択に2.3.1がなくなっている（本手順では2.4.1を選択）

Dependenciesについては、元記事同様"Spring Web"と"Lombok"を選択しました。

## プロジェクトを試験動作させるための変更
元記事と同様ですが一応。`server/src/main/java/com/example/api/ApiApplication.java`を以下のように編集。

```ApiApplication.java
package com.example.api;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class ApiApplication {

    @RequestMapping("/")
    public String home() {
        return "Hello World";
    }

    public static void main(String[] args) {
        SpringApplication.run(ApiApplication.class, args);
    }

}

```

# 3.Docker起動
全く同じです。

コマンドラインから、Docker環境をビルドして

> % docker-compose build

バックグラウンドでDockerを起動

> % docker-compose up -d


# 4. Gradleのビルド
ここも全く同じです。

Javaコンテナ内に入る　※人によってwinptyは必要だったり必要なかったり

> % winpty docker-compose exec java bash

gradleビルド（root@以降は各人違います。一応）

> root@558036f3cbd0:/srv# sh gradlew build

先程も書きましたが、コンテナのJavaを15にしておかないと、以下のようにFailureとか言われる羽目になります（１敗）。

```
FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':compileJava'.
> Could not target platform: 'Java SE 15' using tool chain: 'JDK 14 (14)'.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug
option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 53s
1 actionable task: 1 executed

```

# 5.実行と動作確認
ここも全く同じ

> root@558036f3cbd0:/srv# java -jar build/libs/api-0.0.1-SNAPSHOT.jar

[localhost:8080](http://localhost:8080/)にアクセスすると、先程書いたhome()が実行されて"Hello World"が表示されているはずです。

# 99.感想
この記事が世間的に必要かどうかはさておき、今回の程度のバージョン差異は数回コケながら自力でさっさと解決できるくらいが程々のエンジニア力だと思います（こなみかん

とはいえ想定通りにコケるとか、コケるだろうなと予想しつつ未修正のまま突っ込んで期待通りの結果を得るというのも個人的には大事だと思うので、未来にこれと同じような事態を踏んだ人は同じように試したりすると良いと思います。