StackStormをDockerで起動する

StackStormをDockerで起動する手順です。
ただ、現状Workaroundになっており、今後はもっと手順が簡単になると思われます。

そのworkaround手順を含めた暫定的なリポジトリを公開します。使い方は`README.md`をご覧ください。
また、公式に加えてst2web(GUI版)を起動するようにしています。

* https://github.com/tkit/st2-dockerfiles

これ以降の手順は、公式リポジトリを利用する場合の手順になります。

----------------

ポイントは1つ、「急いで`docker-compose up`するな」ということだけです。

実際に以下をcloneしてから使います。ただ、ここの`README`の手順には従わないでください。

* https://github.com/StackStorm/st2-dockerfiles

現状では、以下の流れに従ってやっていけば大丈夫です。

* https://github.com/StackStorm/st2-dockerfiles/issues/21#issuecomment-238953031

# 手順

## ベースイメージを作る

StackStormは様々なコンポーネントに分かれていますが、それらは全てベースとなる`st2`というコンテナを元にして、単に環境変数で振る舞いを変えているに過ぎません。
まずは、この`st2`コンテナを作ります。

上記リポジトリの`README`にいろいろ書いてありますが、惑わされてはいけません。**その通りにやると動きません**。
以下のようにします。

```bash
$ docker build --build-arg ST2_VERSION="1.6.0-5" --build-arg ST2_REPO="staging-stable" -t st2 stackstorm/
```

ポイントは、`ST2_REPO="staging-stable"`を与えているところです。上記リポジトリ`README`だとそれを指定していませんが、指定しないと別のところにパッケージを取りに行って死にます。

```bash:ST2_REPOを指定しない場合
$ docker build --build-arg ST2_VERSION="1.6.0-5" -t st2 stackstorm/
(snip)
Step 8 : ADD ${ST2_PACKAGE} /tmp/st2_${ST2_VERSION}_amd64.deb
Got HTTP status code >= 400: 404 Not Found
```

また、それすらやらずにここでいきなり`docker-compose up`とかやると、まず死にます。

```bash:いきなり起動した場合
$ docker-compose up

Building data
Step 1 : FROM st2

Pulling repository docker.io/library/st2

ERROR: Service 'data' failed to build: Error: image library/st2:latest not found
```

## 各コンポーネント用のコンテナを作る

この後に即`docker-compose up`をやると、各コンテナはhub側に取りに行ってしまいます。
そこで、まずbuildして各コンポーネント用のイメージを作ります。

```bash:コンポーネント用のイメージ作成
CONTAINERS="st2actionrunner st2api st2auth st2stream st2exporter st2notifier st2resultstracker st2rulesengine st2sensorcontainer st2garbagecollector"
for container in `echo $CONTAINERS`; do
 docker build -t stackstorm/${container}:latest ${container}
done
```

要はぐるぐる回しているだけです。

これをやらずに`docker-compose up` すると、別の所にイメージを取りに行き、結果的に`api`コンテナが起動しません。

```bash:イメージを作らずにcomposeを起動するとエラーになる
api_1               | /etc/st2/st2.conf: FAILED
api_1               | md5sum: WARNING: 1 computed checksum did NOT match
api_1               | /opt/stackstorm/st2/bin/python: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.15' not found (required by /opt/stackstorm/st2/bin/python)
api_1               | /opt/stackstorm/st2/bin/python: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by /opt/stackstorm/st2/bin/python)
```

## 起動する

ここまでくれば、あとは起動します。

```bash
$ docker-compose up -d
$ docker-compose ps
              Name                             Command               State                     Ports
---------------------------------------------------------------------------------------------------------------------
st2dockerfiles_actionrunner_1       /entrypoint.sh                   Up
st2dockerfiles_api_1                /entrypoint.sh                   Up       9101/tcp
st2dockerfiles_auth_1               /entrypoint.sh                   Up       9100/tcp
st2dockerfiles_client_1             /entrypoint.sh st2               Exit 2
st2dockerfiles_data_1               /entrypoint.sh /bin/sh -c  ...   Exit 0
st2dockerfiles_exporter_1           /entrypoint.sh                   Exit 1
st2dockerfiles_garbagecollector_1   /entrypoint.sh                   Up
st2dockerfiles_mongo_1              /entrypoint.sh mongod            Up       27017/tcp
st2dockerfiles_notifier_1           /entrypoint.sh                   Up
st2dockerfiles_rabbitmq_1           docker-entrypoint.sh rabbi ...   Up       25672/tcp, 4369/tcp, 5671/tcp, 5672/tcp
st2dockerfiles_resultstracker_1     /entrypoint.sh                   Up
st2dockerfiles_rulesengine_1        /entrypoint.sh                   Up
st2dockerfiles_sensorcontainer_1    /entrypoint.sh                   Up
st2dockerfiles_stream_1             /entrypoint.sh                   Exit 1
```

概ね上記のようになっているはずです。幾つか落ちているものもありますが、問題ないものもあります。

* `data` : 初回起動時にデータを登録するためだけのコンテナです。一度登録したらいらないので、 `exit 0`で問題ありません。
* `client` : この後、StackStormに対してコマンドを実行するためのコンテナです。コマンドは実行したら結果が返ってきて終了となるので、普段は落ちていても問題ありません。
* `stream`と`exporter` : なんでしょう…これ…

## StackStormを使う

あとは`client`コンテナに対してst2コマンドを発行すれば、好きなように遊ぶことができます。

```bash:各st2コマンドを実行する
$ docker-compose run client st2 action list --pack=core
Starting st2dockerfiles_data_1
+-------------------+------+-------------------------------------------------------------------+
| ref               | pack | description                                                       |
+-------------------+------+-------------------------------------------------------------------+
| core.announcement | core | Action that broadcasts the announcement to all stream consumers.  |
| core.http         | core | Action that performs an http request.                             |
| core.local        | core | Action that executes an arbitrary Linux command on the localhost. |
| core.local_sudo   | core | Action that executes an arbitrary Linux command on the localhost. |
| core.noop         | core | Action that does nothing                                          |
| core.remote       | core | Action to execute arbitrary linux command remotely.               |
| core.remote_sudo  | core | Action to execute arbitrary linux command remotely.               |
| core.sendmail     | core | This sends an email                                               |
| core.windows_cmd  | core | Action to execute arbitrary Windows command remotely.             |
+-------------------+------+-------------------------------------------------------------------+
```

## 注意

WebUIはありません。以下の途中にもありますが、別途そのようなコンテナを作る必要があります。

* https://github.com/StackStorm/st2web