GitLab CI で GitLab Container Registry に push した Docker イメージを使う

GitLab には Docker コンテナレジストリである GitLab Container Registry が統合されています。 GitLab CI は Docker イメージを使って CI を行うので、そこで GitLab Container Registry に push した Docker イメージを使う方法を調べました。

以下の 2 つのリポジトリを使うと仮定します。

  • Docker イメージ自体のリポジトリ: gitlab.com/{user}/dockerfile
  • Docker イメージを CI で使うリポジトリ: gitlab.com/{user}/dockerfile-user

Docker イメージ自体も CI するのが都合が良いと思うので、別のリポジトリとしています。 もちろん同じリポジトリであっても構いません。

なおこの記事中ではホスティングサービスである gitlab.com を想定しています。

Docker イメージのリポジトリで deploy token を作成する

2018-09-27 追記

同じユーザーのプライベートリポジトリ間、もしくは同じグループのプライベートリポジトリ間では、deploy token なしでも .gitlab-ci.ymlimage: registry.gitlab.com/{user}/dockerfile:latest とするだけで Container Registry に push した Docker イメージを利用することができました。 GitLab のリポジトリ間の読み取り権限をそのまま利用しているのではないかと思われます。

追記ここまで

Docker イメージ自体のリポジトリ、すなわち Container Registry を有効にしているリポジトリにて、Settings > Repository > Deploy Tokens から deploy token を作成します。 このとき read_registry にチェックを入れて、Container Registry に対する読み取りアクセスを有効にします1

作成された認証情報である username と password を後ほど使います。

Docker イメージを使うリポジトリで変数 DOCKER_AUTH_CONFIG を設定する

GitLab CI でプライベートコンテナレジストリにログインするには、認証情報を変数 DOCKER_AUTH_CONFIG に設定する必要があります2。 設定する値は、作成した deploy token の username と password を :(コロン)で連結し、Base64 エンコードしたものです。

base64 コマンドを使うと、次のようなコマンドで Base64 エンコードすることができます。echo で改行を出力させないために -n オプションを付けます。

$ echo -n "{username}:{password}" | base64

そして Settings > CI / CD > Variables から DOCKER_AUTH_CONFIG を設定します。

後は .gitlab-ci.ymlimage に Container Registry に push した Docker イメージを指定すれば完了です。

image: registry.gitlab.com/{user}/dockerfile:latest

まとめ

GitLab CI で GitLab Container Registry に push した Docker イメージを使う方法を説明しました。 Container Registry のリポジトリread_registry 権限のある deploy token を作成し、CI を行うリポジトリで deploy token を Base64 エンコードしたものを変数 DOCKER_AUTH_CONFIG に設定することで利用できます。

2018-09-27 追記

同じユーザーまたは同じグループのリポジトリでは、deploy token は必要なく、registry.gitlab.com から始まる Docker イメージをそのまま利用できるようです。