
最近HerokuのContainer Registryのデプロイ方法が変更されました。今回は、その変更への対応方法を紹介します。
はじめに
2018年3月29日にHerokuのContainer Registryのデプロイ方法が変更されました。変更内容はこれです。今まではheroku container:pushをすれば、DockerイメージがPushされて、自動的にデプロイされていました。これがDockerイメージPush用のheroku container:pushおよびリリース用のheroku container:releaseに分割されました。個人的には余計なお世話なのですが、分割されてしまったので対応しましょう。(Herokuユーザには事前にHerokuのプロダクトオーナーから意見を聞くようなメールが来ていたので、この時に「やめとけ」と言っておけば良かったです。。。)
それでは、対応方法を紹介します。
対応方法
heroku container:pushを使っていた場合
Herokuコマンドを使っている場合です。この場合は対応方法は簡単で、単にheroku container:releaseを追加で実行するだけです。プロセスタイプがwebの場合は以下のようになります。
$ heroku container:push web
$ heroku container:release web
既存のDockerイメージをdocker pushしていた場合
DockerHubなどのDockerレジストリ・サービスを使っていた場合です。この場合は「heroku container:release」をしてもうまくいかないので、このStackOverflowを参考にして以下のようなリリーススクリプトを用意します。
heroku-container-release.sh
#!/bin/bash
imageId=$(docker inspect registry.heroku.com/${your-heroku-app}/web:latest --format={{.Id}})
payload='{"updates":[{"type":"web","docker_image":"'"$imageId"'"}]}'
curl -n -X PATCH https://api.heroku.com/apps/${your-heroku-app}/formation \
-d "$payload" \
-H "Content-Type: application/json" \
-H "Accept: application/vnd.heroku+json; version=3.docker-releases" \
-H "Authorization: Bearer ${your-heroku-api-token}"
${your-heroku-app}と${your-heroku-api-token}は適宜読み替えて下さい。
これを使って、以下のように実行すればOKです。例としてDockerHubからイメージをPullしてからHerokuにデプロイする場合を想定してみましょう。
$ docker pull ${your-dockerhub-user}/${your-dockerhub-registory}:latest
$ docker tag ${your-dockerhub-user}/${your-dockerhub-registory}:latest registry.heroku.com/${your-heroku-app}/web:latest
$ docker push registry.heroku.com/${your-heroku-app}/web:latest
$ bash ./heroku-container-release.sh
${your-dockerhub-user}、${your-dockerhub-registory}も適宜読み替えて下さい。
最後に
いかがでしたか?Herokuのヘビーユーザはすでに対応済みの内容だったと思いますが、久しぶりにデプロイして失敗した場合は今回の方法で対処できたと思います。それでは。