Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
13
Help us understand the problem. What is going on with this article?

More than 3 years have passed since last update.

@niku

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

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)

うまく動いている.

13
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
13
Help us understand the problem. What is going on with this article?