docker で OpenGrok のインストール


ソースコード調査をするときに便利な OpenGrok だが、インストール方法が環境によって違うので、なかなか複雑。docker なら環境の違いを気にしなくて良いので、docker を利用した。そのときのメモ。
Docker hub に OpenGrok のイメージはいくつか公開されているけど、あえて作ってみた。

# 環境
* CentOS 7.2
* Docker version 1.9.1, build a34a1d5

# 手順

以下の Dockerfile を作成。Ubuntu 14.04 の image をベースに、OpenGrok の環境を構築する。Docker hub の OpenGrok のイメージの Dockerfile を参考にさせてもらいました。

```docker:Dockerfile

FROM ubuntu:14.04

ENV OPENGROK_INSTANCE_BASE /var/opengrok
RUN mkdir /var/opengrok;\
mkdir /var/opengrok/data;\
mkdir /var/opengrok/etc

RUN apt-get update
RUN apt-get install -y openjdk-7-jre-headless exuberant-ctags git subversion mercurial tomcat7 wget

RUN wget -O - https://java.net/projects/opengrok/downloads/download/opengrok-0.12.1.tar.gz | tar zxvf -;\
mv opengrok-0.12.1/* /var/opengrok/
ENV PATH /var/opengrok/bin:$PATH
RUN OpenGrok deploy

RUN mkdir /src
RUN ln -s /src /var/opengrok/src

ADD run.sh /usr/local/bin/run
ENTRYPOINT ["/usr/local/bin/run"]

EXPOSE 8080
```

Dockerfile の ENTRYPOINT で記載している run.sh は以下。OpenGrok の index を 60 秒ごとに更新する。
docker hub には inotifywait で /src を監視し、index を更新している Dockerfile もあったが、なんか index の更新がうまくできなかったので、60 秒ごとに更新するようにしてみた。

```bash:run.sh
#!/bin/sh

service tomcat7 start

echo "Generate the index."
OpenGrok index /src

echo "Update the index every one minute."
while true
do
	OpenGrok index /src
	sleep 60
done
```

上記の Dockerfile と run.sh を任意のディレクトリに配置して、以下のコマンドで docker image を作成。
Successfully build のメッセージが出力されれば、docker image の作成は成功。REPOSITORY 名は "opengrok/test"。

```
# ls
Dockerfile  run.sh
# docker build --tag='opengrok/test' .
Sending build context to Docker daemon 3.584 kB
Step 1 : FROM ubuntu:14.04
... (省略)
Removing intermediate container dcdf86790657
Successfully built 9891cee642a9
# 
```

ホストの適当なディレクトリに、OpenGrok で見たいソースコードを配置して、opengrok/test コンテナの起動。
以下はホストのディレクトリ /root/src に linux kernel のソースコードを配置した状態でコンテナを起動した例。

```
# ls /root/src
linux-4.4
# docker run -d -v /root/src:/src  -p 8888:8080 opengrok/test
4e5cedbe227bd93eb07608ae1f338b25b321f84870aef410d2f856cdb5035126
#
```

docker logs コマンドで、"Loading the default instance configuration ..." のメッセージが出力されることを確認。出力されていれば、OpenGrok によるソースコードの index 初期化処理が完了し、OpenGrok から参照できる状態。
tomcat の起動に失敗しているメッセージもでるが、とりあえず無視で OK。

ちなみに、上記のように linux kernel だとソースコードが大量なので、index の初期化に結構時間かかる。なので、docker run した直後だと　"Loading the default instance configuration ..." は出ておらず、"Creating default /var/opengrok/logging.properties ..." のメッセージが出力されている。しばらく待つ必要あり。


```
# docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                    NAMES
4e5cedbe227b        opengrok/test       "/usr/local/bin/run"   5 minutes ago       Up 5 minutes        0.0.0.0:8888->8080/tcp   elated_nobel
# docker logs 4e5cedbe227b
 * Starting Tomcat servlet engine tomcat7
   ...fail! <= これは無視して OK
Generate the index.
Loading the default instance configuration ...
  Creating default /var/opengrok/logging.properties ... <= これが出力されている間は index の初期化中
Update the index every one minute.
Loading the default instance configuration ... <= これが出力されていることを確認
# 
```

Webブラウザで、http://ホストの IP アドレス:8888/source/ にアクセスし、OpenGrok
が起動できていれば成功。
 (環境によっては[ホストの IP アドレス]はホスト名とか localhost で OK)

OpenGrok で参照したいソースコードを追加したい場合は、ホストのディレクトリ(上記の例だと /root/src) に追加する。


# 参考記事
https://docs.oracle.com/cd/E39368_01/b71105/section_c5q_n2z_fp.html
https://docs.oracle.com/cd/E39368_01/b71105/section_svq_n2z_fp.html
https://docs.docker.com/engine/reference/builder/
https://github.com/OpenGrok/OpenGrok/wiki/How-to-install-OpenGrok
https://hub.docker.com/r/itszero/opengrok/
https://hub.docker.com/r/scue/docker-opengrok/