はじめに

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に登録します。

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を指定できないようなので、これが指定できるようになると面白いなと思いました。