intra-martが起動するDockerコンテナを作成する

# 概要

intra-mart(http://www.intra-mart.jp/) の環境をDockerコンテナ上に構築します。
CentOS7上で作業しています。

今回目指すイメージは以下のような感じです。

* 「/imart/system/initialsetting」が表示されるところまで確認する
* docker runした際に、imart.warをデプロイできるようにする
* データベースはコンテナ外のものを利用する
* Webサーバ（Apacheとか）は用意しない

試した各アプリケーションのバージョンです。

| application | version       | 説明                                     |
|-------------|---------------|------------------------------------------|
|Resin Pro    | 4.0.48        | intra-martが配布しているものを利用します。  |
|Oracle JDK   | 1.8.0 u91     |                                          |
|intra-mart   | 8.0.11(Karen) |                                          |
|Oracle       | 12.1.0.2      | データベースは今回はコンテナ化の対象外です。 |

# imart.warの作成

以下の手順を参考に別途作成しておいてください。
http://www.intra-mart.jp/download/product/iap/setup/iap_setup_guide/texts/create_war/index.html

# Dockerビルド用のファイルを作成

## Dockerfile

[intra-mart Accel Platform セットアップガイド](http://www.intra-mart.jp/download/product/iap/setup/iap_setup_guide/texts/install/index.html)を参考にしつつ、以下のようなDockerfileを書きました。  

* JDKのインストール
  * OracleのJDKをインストールします。
* Resinのダウンロード/インストール 
  * Resinはintra-martで配布されているものを利用しています。
  * ダウンロードにはユーザIDとパスワードが必要です。お持ちのユーザIDとパスワードをそれぞれDockerfileのRESIN_DOWNLOAD_USERとRESIN_DOWNLOAD_PASSWORDの環境変数に設定してください。
* ojdbc7.jarの配置（ojdbc7.jarは別途ダウンロードして来たものをコピーしています）
* resin.propertiesのコピー
  * 別途用意してください。初期設定のままでいい場合は、`ADD resin.properties ${RESIN_HOME}/conf/resin.properties`の記述を消してください。


```Dockerfile
From centos:7

RUN yum -y install gcc* && \
    yum -y install binutils compat-libcap1 gcc gcc-c++ glibc glibc.i686 glibc-devel glibc.i686 ksh libaio libaio.i686 libaio-devel libaio-devel.i686 libgcc libgcc.i686 libstdc++ libstdc++l7.i686 libstdc++-devel libstdc++-devel.i686 compat-libstdc++-33 compat-libstdc++-33.i686 libXi libXi.i686 libXtst libXtst.i686 make sysstat unzip && \
    yum -y install wget

# install oracle jdk
ENV JDK_VERSION 8u91
ENV JDK_BUILD_NO b14
ENV JDK_PRM jdk-${JDK_VERSION}-linux-x64.rpm
ENV JAVA_HOME /usr/java/jdk1.8.0_91

RUN wget -q \
         --no-check-certificate \
         --no-cookies \
         --header "Cookie: oraclelicense=accept-securebackup-cookie" \
         http://download.oracle.com/otn-pub/java/jdk/${JDK_VERSION}-${JDK_BUILD_NO}/${JDK_PRM} && \
    rpm -ihv ${JDK_PRM} && \
    rm -f ${JDK_PRM}

RUN echo 'export JAVA_HOME=$JAVA_HOME' >> /etc/profile && \
    echo 'export PATH=$PATH:$JAVA_HOME/bin' >> etc/profile

# install resin
ENV RESIN_VERSION 4.0.48
ENV RESIN_DOWNLOAD_USER XXXXXXXXX
ENV RESIN_DOWNLOAD_PASSWORD XXXXXXXXX
ENV RESIN_HOME /opt/resin-pro-${RESIN_VERSION}

RUN wget \
         --http-user=${RESIN_DOWNLOAD_USER} \
         --http-password=${RESIN_DOWNLOAD_PASSWORD} \
         --auth-no-challenge \
         -O /opt/resin-pro-${RESIN_VERSION}.tar.gz \
         http://www.intra-mart.jp/download/product/iap/src/resin-pro-${RESIN_VERSION}.tar.gz

WORKDIR /opt
RUN tar xvzf resin-pro-${RESIN_VERSION}.tar.gz && \
    rm -f resin-pro-${RESIN_VERSION}.tar.gz && \
    cd /opt/resin-pro-${RESIN_VERSION} && \
    ./configure --prefix=/opt/resin-pro-${RESIN_VERSION} --enable-64bit && \
    make && \
    make install

# Setting resin
ADD ojdbc7.jar ${RESIN_HOME}/lib/ojdbc7.jar
ADD resin.properties ${RESIN_HOME}/conf/resin.properties

# deploy script setting
ENV WAR_FILE /temp/imart.war
ADD deploy.sh /opt/deploy.sh
RUN chmod a+x /opt/deploy.sh

EXPOSE 8080
CMD /opt/deploy.sh
```

## deploy.sh

初回起動時にdeploy、2回目以降はdeployをスキップして、start-with-foregroundで起動するようなスクリプトを用意しておいてdocker run時にdeployできるようにしておく。
再デプロイのことは考慮していません。

```bash
#!/bin/sh

if [ -e ${RESIN_HOME}/webapps/imart]; then
    ${RESIN_HOME}/bin/resinctl -server app-0 start-with-foreground
else
    ${RESIN_HOME}/bin/resinctl -server app-0 start && \
        sleep 20s && \
        ${RESIN_HOME}/bin/resinctl deploy ${WAR_FILE}

    ${RESIN_HOME}/bin/resinctl -server app-0 stop
    ${RESIN_HOME}/bin/resinctl -server app-0 start-with-foreground
fi
```

## resin.properties

以下のページを参考に設定します。
http://www.intra-mart.jp/download/product/iap/setup/iap_setup_guide/texts/setting/resin_configuration_file.html

## ojdbc.jar

別途、ダウンロードし入手してください。
http://www.oracle.com/technetwork/database/features/jdbc/jdbc-drivers-12c-download-1958347.html


# Dockerイメージの作成

以下のようなディレクトリ構成にして、`docker build`を実行します。

```
Dockerfile
deploy.sh
resin.properties
ojdbc7.jar
```

Dockerビルドを実行しイメージを作成します。

```bash
docker build -t imart-base:4.0.48 .
```

# コンテナの起動

`docker run`で起動します。
その際の注意点として、/temp/imart.warのwarファイルをデプロイするように指定しているので、-vでimart.warのあるディレクトリをマウントします。
ついでに、storageも永続化しておきたい場合は、マウントしておきます。

```bash
docker run --name imart -p 8080:8080 -v path/to/imartwar:/temp -v path/to/storage:/opt/resin-pro-4.0.48/storage-files imart-base:4.0.48
```

エラーなく起動すれば、`http://server-ip/imart/system/login`にアクセスしていつものテナント設定画面が表示されるはずです。

# 最後に

ちょっと動作確認したり、使い捨てできるようなテスト環境として使ったりしたくて作業しています。
最終的には、Oracleのデータベースも込みでコンテナ化したいなぁと思っています。

あと、ログの確認したいときに、docker logsでは
`Resin/4.0.48 started -server 'app-0' for watchdog at 127.0.0.1:6600 with foreground`
としか、表示されなかったので、仕方なく、
`docker exec コンテナID cat /opt/resin-pro-4.0.48/log/jvm-app-0.log`で起動時のエラーとか確認していました。