Circle CIでHeroku Container RegistryにPush
Circle CIでイメージをビルド、Heroku Container Registryに、pushするための方法を紹介します。
HerokuのContainer Registryは、従来のbuildpackの枠組みのある意味制限を越えて、任意のDockerイメージでデプロイできるという点でとても便利。
しかしうちのネットワークが貧弱すぎて、pushする度に通信に5分程度かかってしまってました。おしい! うちからpushしなければいいじゃん!と思いまして、Circle CIからpushしてみました。結果とてもとても便利です。
circle.yml
これがすべてです。
version: 2 jobs: build: machine: image: 'circleci/classic:edge' steps: - checkout - run: name: build docker image command: | docker build --rm=false -t registry.heroku.com/myapp/web . - run: name: Push to Heroku command: | docker login -u $DOCKER_USER -p $DOCKER_PASS registry.heroku.com docker push registry.heroku.com/myapp/web
machineでedgeイメージ使っているのは、Docker multi-stage buildを使うためです。これを指定しないと、Docker CE 17.03が使われて、ビルドに失敗しちゃいます。
docker buildのタグは適宜変更して下さい。
docker loginで参照しているDOCKER_USER/DOCKER_PASSは、Circle CIの設定画面からEnvironment Variablesとして設定してください。DOCKER_USERは、Herokuの登録E-mailアドレス、DOCKER_PASSは、Herokuの認証トークンです。認証トークンは、以下のコマンドで簡単に取得できました。
$ heroku auth:token 01234567-89ab-cde...
docker pushのタグ名も適宜変更して下さい。