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のタグ名も適宜変更して下さい。