あるSEのつぶやき・改

ITやシステム開発などの技術に関する話題を、取り上げたりしています。

Spring BootのGradleでDockerイメージを作成する

はじめに

この記事は「Getting Started:Spring Boot with Docker」から、実際に動作させてみたことを記録したものになります。

Getting Started 通りだと、エラーがでてDockerイメージを作成できないのでその点も記載します。

Spring Boot アプリケーションを作成することから始めます。

作業環境は、以下の通りです。

  • Java 1.8 以降
  • Docker
  • IntelliJ IDEA Community Edition

IntelliJ IDEA Community Edition のダウンロードとインストールは、下記記事を参考にしてください。

www.aruse.net

Docker は下記サイトからダウンロードできます(アカウントの作成が必要)。

hub.docker.com

Spring Boot のプロジェクト作成

IntelliJ IDEA Community Edition は無償で商用利用も可能な IDE ですが、Spring Boot のプロジェクトを作成できません。

ですので、以下の Spring Initializr というサイトで Spring Boot のプロジェクトを作成します。

基本的にデフォルトなのですが、Dependencies に いくつか追加しています。

項目 設定値 備考
Project Gradle Project
Language Java デフォルト
Spring Boot 2.1.6 デフォルト
Project Meta (Group) com.example デフォルト
(Artifact) demo デフォルト
options デフォルト
Dependencies Spring Web Starter 追加

設定ができたら、[Generate the project] をクリックして、自動生成される demo.zip をダウンロードします。

解凍して作成された demo フォルダを IntelliJ IDEA Community Edition で開いたら、Spring Boot のプロジェクト作成は完了です。

Web API の作成

動作を確認するために、Web API のコントローラーを作成します。

src/main/java/com.example.demo/WebApiController

package com.example.demo;

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

@RestController
public class WebApiController {

    @RequestMapping("hello")
    private String hello() {
        return "Hello, world!";
    }
}

Spring Boot の起動

最初から作成されているDemoApplicationクラスを右クリックして、[Run 'DemoApplication.main()']をクリックすると Spring Boot が起動します。

curlコマンドで動作確認すると問題ないようですね。

$ curl localhost:8080/hello
Hello, world!

Dockerfile の作成

以下の Dockerfile をプロジェクトのルートに作成します。この情報がなかなかなくて苦労しました。

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

build.gradle の修正

Getting Started の載っているbuild.gradleは情報が古く、Spring Initializrが作成する内容に対応できていません。

その上で間違っているのでタチが悪いです。

なので、build.gradleを以下のように修正します。

plugins {
    id 'org.springframework.boot' version '2.1.7.RELEASE'
    id 'java'

    // 追加
    id "com.palantir.docker" version "0.22.1"
}

apply plugin: 'io.spring.dependency-management'

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

/* 不要なのでコメントアウト
task unpack(type: Copy) {
   dependsOn bootJar
   from(zipTree(tasks.bootJar.outputs.files.singleFile))
   into("build/dependency")
}
*/
docker {
    name "${project.group}/${bootJar.baseName}"

    // 不要なのでコメントアウト
    //copySpec.from(tasks.unpack.outputs).into("dependency")
    //buildArgs(['DEPENDENCY': "dependency"])

    // 追加
    files bootJar.archivePath
    buildArgs(['JAR_FILE': "${bootJar.archiveName}"])
}

ビルド&Docker イメージ作成

下記のコマンドを実行すると、プロジェクトをビルドして Docker イメージを作成できます。

$ ./gradlew build && ./gradlew build docker

Docker コンテナの起動・動作確認

Docker イメージが作成されたか確認します。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
com.example/demo    latest              b4dd2545afae        5 seconds ago       122MB
openjdk             8-jdk-alpine        a3562aa0b991        3 months ago        105MB

com.example/demoがちゃんと作成されていますね。

では、下記コマンドで Docker コンテナを起動します。

$ docker run --name docker-spring-boot -p 8080:8080 -d com.example/demo 

状況を確認すると、ちゃんと起動していますね。

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
bc9a551bc20c        com.example/demo    "java -Djava.securit…"   6 seconds ago       Up 5 seconds        0.0.0.0:8080->8080/tcp   docker-spring-boot

動作確認します。

$ curl localhost:8080/hello
Hello, world!

問題ありませんね。

Docker コンテナの終了

下記コマンドで Docker コンテナを終了して削除します。

$ docker stop bc9a551bc20c
$ docker rm bc9a551bc20c
$ docker ps #なにもないことを確認
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

docker-compose.yml の作成

docker-compose.ymlをプロジェクトのルートに作成します。

version: '3'
services:
  app:
    build: .
    image: com.example/demo
    ports:
      - "8080:8080"
    volumes:
      - /tmp

Docker を起動し動作確認します。

# docker イメージの作成/ docker-compose up -d --build はエラーになる
$ ./gradlew build docker

# docker の起動
$ docker-compose up -d

# 動作確認
$ curl localhost:8080/hello
Hello, world!

# docker の終了
$ docker-compose down

おわりに

分かってみれば、そう大したことはない内容ですが、公式の情報が間違っていたり不足していたりするとハマりますね。

Docker で Spring Boot の動作確認ができると、jar ファイルの動作確認にもなるのでいいですね。

お役に立てば幸いです。