heroku で Docker image を使ってデプロイする機能があるのは知ってたけど、one-shot のジョブ以外にまともに使ったことがなかったので、Web アプリケーション、というか Rails アプリケーションをデプロイするにはどうすればいいんだ、ってのを時間をとって調べてみた。
結論としては以下の通り。まずは事前準備としてログインなどをする。
heroku login # heroku にログイン
heroku git:remote -a app-name # 最初の一回のみ実行
heroku container:login # registry にログイン
container:login
を別にやらないとダメなのがややダルではある。で、実際にイメージをデプロイするのは以下のような感じ。
docker build . -t app-name/base:latest # 最初の一回のみ実行、変更した場合は再度ビルドを行う
heroku container:push --recursive # Dockerfile.* を全てビルドして push
heroku container:release web # この例だと Dockerfile.web を公開、今後 job などが増えたらその都度置き換える
Dockerfile.*
が規約として role に勝手に変換してくれるのはよくできている。個人的な感想としては heroku-buildpack-* で動かしているプロジェクトも将来を見据えると全て Docker 準拠のイメージに変更した上でこのやり方に寄せて行ったほうがアプリケーションのポータビリティも向上するしいいように感じる。
k8s もこれくらい楽にアプリケーションをデプロイできればいいのになあ。それを作るのが技術基盤部門の仕事ではあるけど...。
DockerだとOS層のセキュリティ更新にもアプリケーション側で対応しなくちゃいけないのがちょっと残念です。