Slack botからはじめるDocker

  • 39
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

TL;DR

  • Slack bot + Redisの環境をローカルに構築するのは大変><
  • RedisをコンテナにしたらどのOSでも一発で動かせる!
  • Slack botもコンテナにしたらRedisコンテナとの連携も簡単!
  • Docker Composeを使えばBotとRedisを1つのコマンドだけで起動できるよ

Slack botをDockerコンテナ上で動かそう

Slack等で運用するbot,例えばHubotRubotyでデータの永続化をするためにはRedis等のKVSを利用することが多い.
今回はこのSlack bot(Ruboty) + RedisをDockerコンテナ上で動かしてみる.

Redisコンテナ

Redisについては公式にコンテナが提供されている.これをつかえばローカル環境にRedisを導入する必要が無いため,どんな環境でもdocker pull & docker runだけすればとりあえずRedisが動くようになる.

$ docker run  -p 6379:6379 -v /srv/docker/redis:/var/lib/redis redis:latest

Botコンテナ

Base image

この例ではbotにはRubotyを利用するので,Rubyが入っているイメージをベースにする.

FROM ruby:2.2.4

Working directory

つぎに,適当にworking directoryをつくって移動する.

ENV PROJECT /ruboty
RUN mkdir $PROJECT
WORKDIR $PROJECT

Dependencies

続いて,GemfileGemfile.lockのみADDして依存解決を行う(Node.jsならpackage.jsonが該当).先にこれだけ移すのは『Docker で bundle install を爆速にする - Qiita』と同じ理由.

ADD Gemfile $PROJECT
ADD Gemfile.lock $PROJECT
RUN bundle install

Run !

最後に,プロジェクト全体をコンテナに移してbotを起動する.

ADD . $PROJECT
CMD ["ruboty", "--dotenv"]

基本的にはこんな流れ.

補足

native extensionに依存したGemなど利用する場合は適宜apt-get等でいい感じにしておく.
書く場所はたぶんGemfileまわりのことを処理する直前がいい.

Example

Dockerfile
FROM ruby:2.2.4

ENV PROJECT /ruboty
RUN mkdir $PROJECT
WORKDIR $PROJECT

# RUN apt-get update && \
#     apt-get -y --no-install-recommends install <native_extensions>

ADD Gemfile $PROJECT
ADD Gemfile.lock $PROJECT
RUN bundle install

ADD . $PROJECT
CMD ["ruboty", "--dotenv"]

コンテナの起動・連携

Redisコンテナ

設定したいのは主に以下の3つ?

  • 名前
  • ポート番号
  • Data Volumeの設定
    • データを永続化させたいんやろ?
$ docker run -d --name redis -p 6379:6379 -v /srv/docker/redis:/var/lib/redis redis

Botコンテナ

起動オプションはRedisほど多くはないが,RubotyにRedisのURLを伝えてあげないといけない.そのために--linkオプションを利用する.

$ docker run -d --name ruboty --link redis

また,Rubotyには以下のような.envを与えておく(その他,適宜必要な環境変数はとりあえずここに書いておく).

REDIS_URL="redis://${REDIS_PORT_6379_TCP_ADDR}:${REDIS_PORT_6379_TCP_PORT}"
RUBOTY_ENV=production

これでいい感じに連携してくれる.

docker-composeで起動を楽に

ここまででとりあえずDocker container上で動き,データの永続化も出来るbotが完成した.
しかし,大きな問題がある.起動コマンドが長いうえに2つも打たないといけないというものである.

$ docker run -d --name redis -p 6379:6379 -v /srv/docker/redis:/var/lib/redis redis
$ docker run -d --name ruboty --link redis

この問題を解決するためにDocker Composeを利用する.Docker Composeにより,docker-compose.ymlというファイルにコンテナの構成やオプションなどをまとめることが可能になる.

docker-compose.yml
ruboty:
  build: .
  links:
    - redis
  command: ruboty --dotenv --load ./lib/ruboty/trello_reporter.rb
redis:
  image: hypriot/rpi-redis
  ports:
    - 6379:6379
  volumes:
    - /srv/docker/redis:/data
  restart: always

起動もコマンド一発!

$ docker-compose up

まとめ

Slack等で利用するbotをとりあげ,Dockerを導入することで構築・管理等が楽になるという例を紹介した.

  • Slack bot + Redisの環境をローカルに構築するのは大変><
  • RedisをコンテナにしたらどのOSでも一発で動かせる!
  • Slack botもコンテナにしたらRedisコンテナとの連携も簡単!
  • Docker Composeを使えばBotとRedisを1つのコマンドだけで起動できるよ

個人で運用するbotならWebアプリをDockerコンテナで扱うより導入も気軽にできるような気がするので,Dockerよくわからないこわいって人はこういうのも試してみてはどうでしょう?