LoginSignup
15
13

More than 5 years have passed since last update.

Elixir プロジェクトを Docker 化して Heroku の worker として動かす

Posted at

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)

うまく動いている.

15
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
13