Ruby
MongoDB
Heroku
Docker

Heroku で動かしてる Twitter bot の環境を buildpack から Docker に移行した

この記事はOkinawa.rb Advent Calendar 2018の22日目の記事です。

去年 Heroku で Twitter bot を運用する という記事を書いたのですが、今年はその環境を移行したという話です。特にRubyの話は出てきません。


背景



  • heroku-buildpack-mecab を使って Heroku 環境で mecab を使えるようにしていました

  • ですが、buildpack は可搬性が低いため、何らかの理由で Heroku が使えなくなった場合に移行に苦労するのが予想されました

  • そんなわけで Docker 環境に移行しました


詳細


ローカル環境


Dockerfile

FROM ruby:2.5.3

ENV LANG C.UTF-8
RUN apt-get update && apt-get -y install mecab libmecab-dev mecab-ipadic-utf8
RUN gem install bundler
ADD . /yonobot
WORKDIR /yonobot
RUN bundle install

HerokuではmLabというアドオンを使っていますが、ローカルでは公式のMongoDBのDockerイメージを使っています。アドオンの環境にあわせてMongoDB3.6を指定しています。


docker-compose

version: '3'

services:
web:
build: .
tty: true
stdin_open: true
volumes:
- .:/yonobot
depends_on:
- mongo
mongo:
image: "mongo:3.6-stretch"
ports:
- "27020:27017"
volumes:
- mongo:/data/db
volumes:
mongo:
driver: local

これでdocker-compose up するだけで開発環境が準備できるようになりました。


Heroku

Herokuで独自のDockerイメージを使いたい場合、ローカルでbuildしたDockerイメージをHerokuのDocker Registryにpushする方法とheroku.ymlを使う方法があります。

今回はheroku.ymlを使う方法を選びました。Heroku側で自動的にDockerイメージをbuildしてくれるので、運用を考えるとこちらのほうが手軽そうだと考えてのことです。


heroku.yml

setup:

addons:
- plan: mongolab:sandbox
- plan: scheduler:standard
build:
docker:
web: Dockerfile
run:
web: bundle exec bin/yonobot

最後の run: の部分は、何かしら指定しないといけないのでやむなく書いてます。実態は help を表示するだけのコマンドです。

環境変数は従来どおりherokuのWebもしくはCLIから設定します。


まとめ


  • Herokuにてbuildpack環境からDocker環境に移行しました

  • ローカルの開発環境もあわせてDockerに移行しました

  • RubyのDockerイメージ使ってるということ以外一切Rubyと関係ない話でした:bow: