すごい冗長な気がするけど
- hubot with chatwork adapter
- redis
- redisのData Volume Container
の3つのdockerコンテナをdocker-composeで管理できるようにしてみました。
前提
- Mac OS X 10.10.3
- virtualbox 4.3.28
- homebrew
- node.js
手順
dockerインストール
今回はboot2docker上でdockerを動かします。
brew install boot2docker
boot2docker VMを作成して起動します。
boot2docker init
boot2docker start
環境変数をセットします。
$(boot2docker shellinit)
docker-composeインストール
brew install docker-compose
hubot環境を作る
ローカルにhubot環境を作ります。
公式に倣ってyeomanでひな形を生成します。
npm install -g yo generator-hubot
mkdir myhubot
cd myhubot
yo hubot
幾つか質問されます。Bot adapterにはchatwork
と入力します。
ひな形が生成されたらカレントディレクトリにあるexternal-scripts.json
を開きます。
今回herokuは使わないのでhubot-heroku-keepalive
を消しておきます。
hubotコンテナのDockerfileを書く
上記でhubotのひな形を作ったプロジェクトのルートディレクトリにDockerfile
を置きます。
FROM node:latest
ENV BOT_HOME /bot
RUN mkdir $BOT_HOME
WORKDIR $BOT_HOME
ADD ./package.json $BOT_HOME/
RUN npm install
ADD . $BOT_HOME
CMD ["bin/hubot", "--adapter", "chatwork"]
先にpackage.json
だけをADD
してnpm install
することで、package.json
に変更がなければbuildをスキップさせることができます。RailsのDockerfile内でGemfileに対して使われている手法を真似してみました。
.dockerignoreファイルを作る
build時に変更があったことを検知してほしくないファイルは無視されるようにしておきます。
## node
node_modules
.git
## log
.hubot_history
## OSX
.DS_Store
docker-compose.ymlを書く
hubotはDockerfileからbuild、redisとData Volume Containerはimageから作ります。
このdocker-compose.yml
もプロジェクトのルートに置きます。
redis:
restart: always
image: redis:latest
command: redis-server --appendonly yes
volumes_from:
- storage
storage:
restart: always
image: busybox:latest
volumes:
- /var/lib/redis:/data
hubot:
restart: always
build: .
ports:
- '8190:8080'
environment:
REDIS_URL: redis://redis:6379
HUBOT_CHATWORK_TOKEN:
HUBOT_CHATWORK_ROOMS:
HUBOT_CHATWORK_API_RATE: 420
TZ: Asia/Tokyo
links:
- redis
hubotコンテナの環境変数にはredisの接続に必要なREDIS_URL
と、chatwork用hubotアダプターの環境変数、あとはタイムゾーン設定をするTZ
を設定してみました。
環境変数は、値を空にすることでdocker-compose up
時にhostマシンに設定されている同じ名前の環境変数を読み込ませる事ができます。セキュアな情報を書きたくない時に便利ですね。
Compose yml - Docker Documentation
一応8190ポートでhubotにアクセスできるようにしていますが、chatworkと連携するだけならこれは特に必要ないです。
起動
先にhostのMac側でchatworkの環境変数を設定しておきます。
export HUBOT_CHATWORK_TOKEN=XXXXXXXXXXXXXXXXXX
export HUBOT_CHATWORK_ROOMS=XXXXXX,XXXXXX
プロジェクトのルートディレクトリで起動します。
docker-compose up -d
up
コマンドはbuildから起動まで全部まとめてやってくれます。
Compose command line - Docker Documentation
-d
オプションを付けることでバックグラウンドで起動しています。
これでhubotが動くようになりました。chatwork上で話しかけたらなんか答えてくれると思う。
ソースはGitHubに置いています。
distkloc/docker-hubot-chatwork