nekop's blog

OpenShift / JBoss / WildFly / Infinispanの中の人 http://twitter.com/nekop

MattermostをOpenShift Enterprise 3.1.1上でインスタントアプリケーション化する

MattermostはSlackのようなWebベースのチームチャットツールです。GolangとReactで書かれています。

以下の一行でセットアップができるようになっています。Mattermost 1.4.0, MySQL 5.6でMySQLがPersistentVolume使います。コードはGitHubにあります。

oc new-app -f https://raw.githubusercontent.com/nekop/openshift-sandbox/master/apps/mattermost/mattermost.yaml

アクセスすると以下のように初期画面がでます。

f:id:nekop:20160205145040p:plain:w300

このアプリケーションの定義ファイル(マニフェスト、とも呼ばれます)は200行程度です。route定義は含めていないのですが、oc expose svc mattermostすればrouteができて環境に応じたURLが割り当たるはずなので、マニフェストには含めなくてもいいかなぁ、と思っています。

Mattermostはjson設定ファイルにデータベースの接続情報を持つので、DockerのENTRYPOINTに指定する起動シェルスクリプトで、環境変数からデータベースの接続情報をこのファイルに反映させる、という処理をする必要があります。

Mattermostはデータベースの接続情報の他にも設定項目はいっぱいあるのですが、デプロイ時に動的に変わるものはとりあえずデータベースの接続情報だけのような感じだったので、あとの設定はイメージに焼いてしまっていいかなーと思って環境変数化していません。というか50個くらいある設定項目を全部環境変数にしてしまうと環境変数ヘルと呼ばれるような状態になりますし、json書き換えるのも収集つかなくなると思います。他の設定項目を書き換えたかったらおとなしくイメージを再ビルドすることにします。ビルドはOpenShiftに投げるだけですしね。

これからのDocker対応アプリケーションでどのように設定を受け取るか、というのは結構重要なポイントかもしれません。とりあえずアプリケーションは設定を環境変数を受けとれるようにする、という機能は入れておいて欲しいですね。yamlやらjsonやらxmlの設定ファイルに環境変数を反映させるようシェルスクリプトで書き換えるのはかなりきびしい印象があります。また、外部から設定情報をフェッチする、という方法も考えたんですがDockerイメージの自己完結性が失われるのでかなりダメな感じがします。外部に置いてある設定ファイルを編集したら動いていたDockerイメージが動かなくなった、というのはちょっと勘弁してもらいたいシナリオです。DockerイメージはDocker環境で完結する情報だけで動作すべきでしょう。

今回Mattermostのインスタントアプリケーションを作る手順は以下のような感じでした。

  1. Dockerfileを書いてgit push
  2. ベース作成のために oc new-app
    • oc new-app <git clone url>
  3. oc exportしてベースにするyaml生成
    • oc export dc,is,bc,svc -o yaml --as-template=mattermost > mattermost.yaml
  4. import時に省略できる設定も明示的にexportされてしまうので(ポータビリティ考えるとまぁそうだよね感)、そのへんは消す。dancer-exampleが結構最小に近いようなので参考にした。
    • oc get template dancer-example -n openshift -o yaml
  5. アプリケーション名をAPPLICATION_NAMEパラメータにして作成時にカスタマイズできるようにする
    • mattermost${APPLICATION_NAME}に置換して最終部パラメータにAPPLICATION_NAMEを定義
  6. MySQLを追加する。mysql-persistentのテンプレートからobjectsとparametersを抜き出してそのままmattermost.yamlにつなげる
    • oc get template mysql-persistent -n openshift -o yaml
  7. MySQLのパラメータをmattermostのDeploymentConfigにも渡すようにする
  8. mysqlのDeploymentConfigのenvをそのままコピー
  9. 設定ファイルにデータベース接続情報を反映させて起動するmattermost-launch.shを作成してDockerfileENTRYPOINTにする

いくつか参考になるテンプレート、シェルスクリプトやDockerfileを把握しておけば1時間程度でできるかな、という雰囲気です。