CLOVER🍀

That was when it all began.

Minishift上に、Uber JARなSpring Bootアプリケーションをデプロイする

Minishiftから引き込まれるOpenShift Originには、WildFlyのImageStreamが含まれています。

これを使うとWARファイルはデプロイできるのですが、Spring Bootアプリケーションでよくあるような、
組み込みTomcatを使用したUber JARの場合とかどうなるのかなぁと…。

調べまわった結果、OpenJDKのImageStreamの定義がこちらにありました。

https://github.com/jboss-openshift/application-templates/tree/master/openjdk

これ、リポジトリを見ると

This project contains OpenShift v3 application templates which support applications based on JBoss Middleware products.

https://github.com/jboss-openshift/application-templates

なので、商用環境とかで使う場合は要ライセンス的な感じですよねぇ。JBoss EAPとかのImageStreamもありますし。

とりあえず、今回はMinishift上で軽く動かしてみるだけで試してみることに。

参考)
Source-to-Image (S2I) / Java

環境

確認した環境は、こちらです。

$ minishift version
minishift v1.22.0+7163416

$ minishift status
Minishift:  Running
Profile:    minishift
OpenShift:  Running (openshift v3.9.0+71543b2-33)
DiskUsage:  14% of 19G (Mounted On: /mnt/sda1)
CacheUsage: 1.946 GB (used by oc binary, ISO or cached images)

サンプルアプリケーション

用意したサンプルアプリケーションは、こちら。
pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>hello-app</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <spring-boot.version>2.0.4.RELEASE</spring-boot.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

src/main/java/com/example/App.java

package com.example;

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

@RestController
@SpringBootApplication
public class App {
    public static void main(String... args) {
        SpringApplication.run(App.class, args);
    }

    @GetMapping("hello")
    public String hello() {
        return "Hello My Application!!";
    }
}

これを、どこかしらのGitリポジトリに登録しておきます。

OpenJDKのImageStreamの登録

今回は、このImageStreamの定義のv1.4.15を使ってみることにしました。
https://raw.githubusercontent.com/jboss-openshift/application-templates/ose-v1.4.15/openjdk/openjdk18-image-stream.json

以下のコマンドで、openshift namespaceにImageStreamを登録します。この時、cluster-admin権限のあるアカウントで行ってください。

$ oc create -f https://raw.githubusercontent.com/jboss-openshift/application-templates/ose-v1.4.15/openjdk/openjdk18-image-stream.json -n openshift --as system:admin
imagestream "redhat-openjdk18-openshift" created
imagestream "java" created

openshift namespaceのImageStreamに、対象のImageStreamが登録されます。

$ oc get is -n openshift | grep -E 'jdk|java'
java                         172.30.1.1:5000/openshift/java                         8,latest                      About a minute ago
redhat-openjdk18-openshift   172.30.1.1:5000/openshift/redhat-openjdk18-openshift   1.0,1.1,1.2 + 2 more...       About a minute ago

アプリケーションのデプロイ

あとは、このImageStreamを使って「oc new-app」を実行します。

$ oc new-app [GitリポジトリのURL] -i openshift/java

# または

$ oc new-app [GitリポジトリのURL] --image-stream=openshift/java

これで、Uber JARなアプリケーションがデプロイできます。