この記事はOkinawa.rb Advent Calendar 2018の22日目の記事です。
去年 Heroku で Twitter bot を運用する という記事を書いたのですが、今年はその環境を移行したという話です。特にRubyの話は出てきません。
背景
- heroku-buildpack-mecab を使って Heroku 環境で mecab を使えるようにしていました
- ですが、buildpack は可搬性が低いため、何らかの理由で Heroku が使えなくなった場合に移行に苦労するのが予想されました
- そんなわけで Docker 環境に移行しました
詳細
ローカル環境
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を指定しています。
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してくれるので、運用を考えるとこちらのほうが手軽そうだと考えてのことです。
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と関係ない話でした