この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
小室です。
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でコンテナを起動して外部に公開します。