Heroku では昔ながらの git リポジトリ push でのデプロイの他に,Docker を利用した Container Registry でデプロイが行える.
また, Heroku では HTTP リクエストを受けてレスポンスを返す Web dyno の他に,バックグラウンドで動く Worker Dyno を作ることができる.
今回, Elixir のアプリケーションを Docker コンテナに乗せて Heroku の worker として動かせるようにデプロイした.
Dockerfile は以下のとおり.気をつけるべきところにはコメントを入れた.
FROM elixir
MAINTAINER niku
# MIX_HOME は required .こうしないと heroku に Deploy した後起動するときに,mix deps.get したはずのライブラリを見つけられない
# MIX_ENV は optional
# MIX_DEBUG は optional
ENV MIX_DEBUG=true \
MIX_HOME=/root/.mix \
MIX_ENV=prod
RUN mkdir /app
ADD . /app
WORKDIR /app
RUN mix local.hex --force && \
mix deps.get && \
mix compile
# https://devcenter.heroku.com/articles/container-registry-and-runtime#dockerfile-commands-and-runtime
# によると ENTRYPOINT も動作するので
# ENTRYPOINT ["mix"]
# CMD ["run", "--no-halt"]
# でも動くように思えるのだけど `run` command not found で動作しなかった.
# --no-halt を指定しないと起動直後にすぐ終了してしまう
CMD ["mix", "run", "--no-halt"]
と設定する.
Docker コンテナを worker として Heroku へデプロイするには
% heroku container:push worker
というコマンドで行える.詳しくは Pushing an image(s) に書いてある.
この組み合わせで Eloido という Elixir 製 Bot アプリケーションを Heroku の worker として動かすことができた.
こんな感じ.
% heroku ps
Free dyno hours quota remaining this month: 982h 50m (98%)
For more information on dyno sleeping and how to upgrade, see:
https://devcenter.heroku.com/articles/dyno-sleeping
=== worker (Free): mix run --no-halt (1)
worker.1: up 2017/09/20 22:57:39 +0900 (~ 20h ago)
うまく動いている.