An open API service indexing awesome lists of open source software.

https://github.com/devlights/vscode-docker-java11env-springboot

(VSCode + Remote Container) + Docker + JDK11 + SpringBoot
https://github.com/devlights/vscode-docker-java11env-springboot

Last synced: about 2 months ago
JSON representation

(VSCode + Remote Container) + Docker + JDK11 + SpringBoot

Awesome Lists containing this project

README

        

# はじめに

VSCode上で Remote Container を使い、SpringBootアプリを開発して

ステージ用の tomcat と springboot コンテナでも起動するように調整する。
(デバッグは、VSCodeでデバッグ起動して行う)

作業を行うエンジニアのローカルには java がインストールされている必要はない。

以下のものだけインストールされていれば良い。

- VSCode
- Docker

まず、以下の作業からスタート

- VSCodeで本ディレクトリを開く
- コマンドパレットで "reopen in container" を実行

# SpringBoot プロジェクト作成

```sh
$ spring init --dependencies=web demo
```

# resouces/application.properties を更新

```
server.servlet.context-path=/demo
```

# DemoApplication.java を更新

- War起動時に呼び出されるように SpringBootServletInitializer を継承

```java
package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

@SpringBootApplication
public class DemoApplication extends SpringBootServletInitializer {

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

@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(DemoApplication.class);
}
}
```

# HelloControllerを作成

```java
package com.example.demo;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

@RequestMapping(path = "/hello")
public String home() {
return "helloworld";
}
}
```

# VSCode 上で SpringBoot を起動してデバッグ

ここまでの調整で、VSCode 上で F5 または SPRING BOOT DASHBOARD よりデバッグ起動できるようになっている。

起動したら ```localhost:8080/demo/hello/``` で出力が表示されることを確認出来る。

# pom.xml を war 出力用に調整

- packaging を切替可能に
- spring-boot-starter-tomcat を dependency に追加
- scope を切替可能に
- build を調整

```xml

4.0.0

org.springframework.boot
spring-boot-starter-parent
2.5.6


com.example
demo
0.0.1-SNAPSHOT
demo
Demo project for Spring Boot


${packaging.type}


debug

true


jar




release

war
provided



8



org.springframework.boot
spring-boot-starter-web


org.springframework.boot
spring-boot-starter-tomcat
${tomcat.provided}


org.springframework.boot
spring-boot-starter-test
test


${project.artifactId}


org.springframework.boot
spring-boot-maven-plugin


org.apache.maven.plugins
maven-compiler-plugin

${java.version}
${java.version}



```

# jar ファイル作成

```sh
$ (cd demo && mvn clean package -Pdebug)
```

以下で、SpringBootをtomcat内蔵版で起動

```sh
$ java -jar demo/target/demo.jar
```

# SpringBoot コンテナ用の Dockerfile 作成

```docker
FROM adoptopenjdk/openjdk11:alpine-slim

WORKDIR /app
COPY ./demo/target/demo.jar /app

ENTRYPOINT [ "java", "-jar", "/app/demo.jar" ]
CMD [ "sleep", "infinity" ]
```

## Docker イメージビルド

```sh
$ docker image build -t stage-springboot -f Dockerfile.springboot ${PWD}
```

## Docker コンテナ起動

```sh
$ docker container run -dit -p 8082:8080 --rm --name stage-springboot-demo stage-springboot
```

## Docker コンテナ停止

```sh
$ docker container stop stage-springboot-demo
```

# war ファイル作成

```sh
$ (cd demo && mvn clean package -Prelease)
```

# Tomcat コンテナ用の Dockerfile 作成

```docker
# tomcat 8
#FROM tomcat:8-jdk11-temurin

# tomcat 9
FROM tomcat:9-jdk11-temurin

# tomcat 10
# tomcat10 で SpringBoot は現状動かない
# - https://github.com/spring-projects/spring-boot/issues/22414
#FROM tomcat:jdk11-temurin

WORKDIR /usr/local/tomcat/webapps/
COPY ./demo/target/demo.war /usr/local/tomcat/webapps/
```

## Docker イメージビルド

```sh
$ docker image build -t stage-tomcat -f Dockerfile.tomcat ${PWD}
```

## Docker コンテナ起動

```sh
$ docker container run -dit -p 8081:8080 --rm --name stage-tomcat-demo stage-tomcat
```

## Docker コンテナ停止

```sh
$ docker container stop stage-tomcat-demo
```

# 作業しやすいように Makefile を用意

```makefile
build:
(cd demo && mvn package -Pdebug -DskipTests=true && mvn package -Prelease -DskipTests=true)
docker image build -t stage-tomcat -f Dockerfile.tomcat ${PWD}
docker image build -t stage-springboot -f Dockerfile.springboot ${PWD}

clean:
(cd demo && mvn clean)

start-tomcat:
docker container run -dit -p 8081:8080 --rm --name stage-tomcat-demo stage-tomcat
@echo "Launch webapp: http://localhost:8081/demo/hello/"

stop-tomcat:
docker container stop stage-tomcat-demo

start-springboot:
docker container run -dit -p 8082:8080 --rm --name stage-springboot-demo stage-springboot
@echo "Launch webapp: http://localhost:8082/demo/hello/"

stop-springboot:
docker container stop stage-springboot-demo
```

- clean ターゲット
- ビルド生成物削除 (Jar and War)
- build ターゲット
- jar作成
- war作成
- tomcat dockerイメージ作成
- springboot dockerイメージ作成
- start-tomcat ターゲット
- tomcat dockerイメージからコンテナ起動
- 8081で起動
- stop-tomcat ターゲット
- tomcat コンテナを停止 (同時にコンテナ削除)
- start-springboot ターゲット
- springboot dockerイメージからコンテナ起動
- 8082で起動
- stop-springboot ターゲット
- springboot コンテナを停止(同時にコンテナ削除)

```sh
$ make clean
$ make build
$ make start-tomcat
$ make stop-tomcat
$ make start-springboot
$ make stop-tomcat
```

# 参考情報

- https://www.saka-en.com/java/spring-boot-war-tomcat/
- https://qiita.com/YumaInaura/items/1647e509f83462a37494
- https://qiita.com/rockbirds12/items/13aebcb33214c0bd4d4b
- https://stackoverflow.com/questions/52628246/spring-boot-web-app-not-running-on-tomcat-9
- https://qiita.com/bokuwakuma/items/04c0d82b6abfa334fce9
- https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html
- https://github.com/spring-projects/spring-boot/issues/22414