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
アクセスすると以下のように初期画面がでます。
このアプリケーションの定義ファイル(マニフェスト、とも呼ばれます)は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のインスタントアプリケーションを作る手順は以下のような感じでした。
Dockerfile
を書いてgit push
- ベース作成のために
oc new-app
oc new-app <git clone url>
oc export
してベースにするyaml生成oc export dc,is,bc,svc -o yaml --as-template=mattermost > mattermost.yaml
- import時に省略できる設定も明示的にexportされてしまうので(ポータビリティ考えるとまぁそうだよね感)、そのへんは消す。dancer-exampleが結構最小に近いようなので参考にした。
oc get template dancer-example -n openshift -o yaml
- アプリケーション名を
APPLICATION_NAME
パラメータにして作成時にカスタマイズできるようにするmattermost
を${APPLICATION_NAME}
に置換して最終部パラメータにAPPLICATION_NAME
を定義
- MySQLを追加する。mysql-persistentのテンプレートからobjectsとparametersを抜き出してそのままmattermost.yamlにつなげる
oc get template mysql-persistent -n openshift -o yaml
- MySQLのパラメータをmattermostのDeploymentConfigにも渡すようにする
- mysqlのDeploymentConfigのenvをそのままコピー
- 設定ファイルにデータベース接続情報を反映させて起動する
mattermost-launch.sh
を作成してDockerfile
のENTRYPOINT
にする
いくつか参考になるテンプレート、シェルスクリプトやDockerfileを把握しておけば1時間程度でできるかな、という雰囲気です。