[Java][Docker] Build Docker Image for JBot Application

はじめに

小室です。

JBotフレームワークを細々と調べていこうとしたら、社内の人に目を付けられてしまったためブーストせざるを得ない状況になってしまいました。ぼんやりしてるとネタを色々と取られてしまいそうなので、サクサク書いていきます。

今回は短め。

なぜDocker

JBotフレームワークではSlackの slash commandの機能もサポートしているのですが、こちらはローカルマシンだと少々難しいようです。 というのも、SlackのSlash CommandのConfigurationを見れば分かるのですが、Slash Commandを実行した際にフックさせるURLが必要になります。

そのため、ローカルでは少々検証が難しいので手っ取り早くDocker Image化し、ECSで公開出来る直前まで持っていってしまいます。SpringBootプロジェクトのDocker化はこちらを参照し、若干改造しました。

jbot-exampleをビルドする

前回のjbot-exampleをそのまま利用します。 そのままのpomファイルではビルド時にManifestが作成されなかったため、jarファイルが実行できません。以下の定義を追加します。

こちらのpomファイルは jbot-example/ ディレクトリ以下にあるものに追加します。

<?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">

(snip...)
    <!-- Build Config -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

上記の記述を追加した後、以下のコマンドを実行します。

$ mvn package

こちらを実行するとjarファイルが作成されます。Build Successfulと出ていれば成功です。

(snip...)
[INFO] --- spring-boot-maven-plugin:1.4.0.RELEASE:repackage (default) @ jbot-example ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 10.069 s
[INFO] Finished at: 2017-02-18T14:19:10+09:00
[INFO] Final Memory: 19M/216M
[INFO] ------------------------------------------------------------------------

jarファイルを作成し、そのまま実行する場合は以下のコマンドを実行します。

$ mvn package && java -jar jbot-example/target/jbot-example-1.0.0-SNAPSHOT.jar

作成したjarファイルで起動に成功すればOKです。

Docker Imageを作成する

さて、jarファイルは作成できたのでDocker Imageを構成します。こちらにDockerfileを作成しました。

Dcokerfileを作成する

FROM java:openjdk-8-jdk
EXPOSE 8080
WORKDIR /opt/app/
ADD jbot-example/target/jbot-example-1.0.0-SNAPSHOT.jar /opt/app/

RUN sh -c 'touch /opt/app/jbot-example-1.0.0-SNAPSHOT.jar'
ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "java -jar /opt/app/jbot-example-1.0.0-SNAPSHOT.jar" ]

FROM

イメージのBaseは openjdk-8-jdk を利用しました。OSはDebianです。

EXPOSE

コンテナは8080ポートをListenするように指定します。

WORKDIR

命令を実行するディレクトリの指定で /opt/app/ を指定します。

ADD

jbot-example以下のディレクトリでビルドしたjarファイルを /opt/app/ 以下へ配置します。

RUN

shellでtouchコマンドを利用。jarファイルのタイムスタンプを現在日時に更新します。

ENV

環境変数のJAVA_OPTSを設定してますが空。Javaの起動オプションはなし

ENTRYPOINT

jarファイルを実行するようにjavaコマンドを記述します。

Docker Imageを作成する

Docker Buildコマンドを使ってImageを作成します。

docker build -t jbot-docker .

Dockerコンテナを作成

以下のコマンドでコンテナを作成してアプリケーションを実行します。以下のコマンドではdaemon実行ではないのでアプリケーションの実行ログがそのまま出力されます。

$ docker run --name jbot-container-instance -p 8080:80 jbot-docker

(snip)
2017-02-19 12:02:14.600  INFO 6 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2017-02-19 12:02:14.800  INFO 6 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2017-02-19 12:02:14.875  INFO 6 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
2017-02-19 12:02:14.886  INFO 6 --- [           main] example.jbot.JBotApplication             : Started JBotApplication in 8.02 seconds (JVM running for 8.534)

コンテナの起動を確認してみると起動していることがわかります。

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                            NAMES
ed6599e8ef67        jbot-docker         "sh -c 'java -jar ..."   28 hours ago        Up 8 seconds        8080/tcp, 0.0.0.0:8080->80/tcp   jbot-container-instance

停止は docker stop CONTAINER_ID を実行します。

ひとまずWebアプリケーションとして公開する第一歩として起動可能なDocker Imageを作成しました。

次はECSでコンテナを起動して外部に公開します。

参照