はじめに
HerokuにはHeroku Container Registry & RuntimeというHerokuでDockerベースのアプリケーションを実行できる非常に便利なサービスがあります。さらに便利なことにdynoのタイプ(web, workerなど)ごとに異なるimageをプッシュできるのです。
が、たとえばweb dynoとHeroku Scheduler経由で実行するscheduler dynoのimageを分けることってできるのか? という疑問がわいてきたので調べてみました。
結論
- 先に答えを言っちゃうとschedulerというdynoとしてpushしておくとHeroku Schedulerはschedulerのimageを使いました。
- web dynoしか存在しない場合はwebのimageを使うようです。
調査
web dynoだけ存在する場合
下記のようなDockerfileをつくります。
FROM alpine:3.7
ENV HEROKU_DYNO_TYPE web
COPY test.sh /
あとtest.shの中身はこれだけ。
#!/bin/sh
echo $HEROKU_DYNO_TYPE
これをweb dynoのimageとしてHerokuにデプロイします。
$ heroku container:push web
$ heroku container:release web
そしたら後はHeroku Schedulerに登録します。
実行されるのを待ちます。
以下、ログ。
2018-06-02T10:59:16.437599+00:00 heroku[scheduler.9930]: Starting process with command `sh /test.sh`
2018-06-02T10:59:15.683883+00:00 app[api]: Starting process with command `sh /test.sh` by user scheduler@addons.heroku.com
2018-06-02T10:59:17.006412+00:00 heroku[scheduler.9930]: State changed from starting to up
2018-06-02T10:59:18.683814+00:00 heroku[scheduler.9930]: Process exited with status 0
2018-06-02T10:59:18.703243+00:00 heroku[scheduler.9930]: State changed from up to complete
2018-06-02T10:59:18.616362+00:00 app[scheduler.9930]: web
当然、echoの結果はwebです。
web, scheduler dynoの2種類が存在する場合
次に、web dynoに加えてscheduler dynoのimageをpushしてみます。web, schedulerという2つのdyno typeが存在する場合にHeroku Schedulerはどちらを使うのか確かめていきたいと思います。
以下、scheduler用のDockerfileです。
FROM alpine:3.7
ENV HEROKU_DYNO_TYPE scheduler
COPY test.sh /
さきほどのtest.shの中身は同じです。
Herokuにdeployしましょう。
$ heroku container:push scheduler
$ heroku container:release scheduler
再度、Heroku Schedulerから実行されるのを待ちます。
以下、ログ。
2018-06-02T11:07:21.720274+00:00 heroku[scheduler.8412]: Starting process with command `sh /test.sh`
2018-06-02T11:07:21.305555+00:00 app[api]: Starting process with command `sh /test.sh` by user scheduler@addons.heroku.com
2018-06-02T11:07:22.407043+00:00 heroku[scheduler.8412]: State changed from starting to up
2018-06-02T11:07:23.722126+00:00 heroku[scheduler.8412]: Process exited with status 0
2018-06-02T11:07:23.671761+00:00 app[scheduler.8412]: scheduler
2018-06-02T11:07:23.744133+00:00 heroku[scheduler.8412]: State changed from up to complete
schedulerと出ていますね。興味深いです。
2018-06-02T11:07:23.671761+00:00 app[scheduler.8412]: scheduler
おわりに
- Heroku Scheduler経由で実行するバッチ処理のimageはwebとは別のやつを使いたいよというケースではけっこう使えるんじゃないでしょうか。
- Heroku Schedulerではdyno typeを指定できないようなので、これが指定できるようになると面白いなと思いました。