CircleCI で GCR(Container Registry) の private な Docker image を利用する方法


CircleCI 2.0, 2.1 で確認。

会社のプロジェクトなどで、 GCR等で private にした Docker image をそのままCircleCIのジョブで使用したいことがあると思います。特に GCR はやり方を忘れそうだったので備忘録として残しておきます。

手順

① GCRにアクセスするための適当なサービスアカウントをIAMで作成

GCR のDocker imageは GCS に自動作成されたバケットに保存されており、
CircleCI からそのバケットにアクセスする必要がある。

② GCRのimageが保存されているGCSバケットに対して、①に閲覧権限を付与

GCRにDocker imageを置いていれば artifacts.プロジェクト名.appspot.com のような名前のバケット名が自動的にできており、そこにimageが保存されている。
(GCRのリージョンによっては asia.artifacts.プロジェクト名.appspot.com のようになる)

GCSの画面にて、このバケットの ストレージオブジェクト閲覧者 の権限を ①で作成したサービスアカウントに対して付与する。
(GCR自体にアクセスするためのロールは存在しないことに注意。 参考: https://cloud.google.com/container-registry/docs/access-control#permissions_and_roles

③ 権限を付与したサービスアカウントのJSONキーをCircleCIの環境変数に設定

②で権限を付与した後にサービスアカウントのJSONキーをダウンロードし、CircleCIの環境変数に設定する。 (今回は GCR_CREDS という名前に。)
JSONキーの内容をコピーしてそのまま環境変数の値として入れればOK。

.circleci/config.yaml に認証情報を記述

③で設定した環境変数を使って以下のように記述すれば完成。

_json_key は、GCRにサービスアカウントからアクセスする際のユーザー名らしい。
(参考: https://cloud.google.com/container-registry/docs/advanced-authentication )

.circleci/config.yaml
docker: 
  - image: gcr.io/プロジェクト名/イメージ名:タグ
    auth:
      username: _json_key
      password: $GCR_CREDS

参考: Impossible to use a private gcr.io base image on Circle 2.0?