[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でコンテナを起動して外部に公開します。