Drone CI: Docker Hub にログインしてイメージを Pull する

2020年11月から Docker Hub でログインなしの匿名ユーザからの Pull 回数には IP あたり上限(6 時間あたり 100 回まで)が設けられたため、以下のようなエラーになってしまう場合がある。

Error response from daemon: toomanyrequests: You have reached your pull rate limit. You may increase the limit by authenticating and upgrading: https://www.docker.com/increase-rate-limit

これを回避するため、ユーザー認証して Pull する。

参考)

  • https://blog.nijohando.jp/post/2020/drone-pull-image-with-auth/

手順

Docker Hub へのアクセストークンを発行する

  1. Docker Hub にログインする。

  2. Account Settings > Security > Access Tokens から「New Access Token」でアクセストークンを生成する。

  3. ユーザー名とアクセストークンを結合して Base64 化する。

    shell DOCKERHUB_USERNAME=(ユーザー名) DOCKERHUB_ACCESS_TOKEN=(アクセストークン) DOCKERHUB_AUTH=$(echo -n "${DOCKERHUB_USERNAME}:${DOCKERHUB_ACCESS_TOKEN}" | base64)

.drone.yml に設定

参考) Pulling Private Images

.drone.yml に image_pull_secrets を記述することで、docker pull 時の認証情報を指定する。(dockerconfig は Secret 名)

image_pull_secrets:
  - dockerconfig

Secrets に認証情報を設定

以下の内容で Secrets に登録する。

  • SecretName: dockerconfig

  • SecretValue

json { "auths": { "https://index.docker.io/v1/": { "auth": "(発行したアクセストークン)" } } }

Secrets に認証情報を設定 (Encrypted Secrets の場合)

参考) Secrets - Encrypted

OSS 版の場合は Encrypted しか対応していないため、.drone.yml に暗号化して記述する。

  1. Drone で暗号化する。

    shell export DRONE_SERVER=https://drone.example.jp export DRONE_TOKEN=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX REPOSITORY_NAME=(設定先リポジトリ名) drone encrypt "${REPOSITORY_NAME}" "{\"auths\":{\"https://index.docker.io/v1/\":{\"auth\":\"${DOCKERHUB_AUTH}\"}}}"

  2. 暗号化したデータを .drone.yml の Secrets に追記する。

    yaml kind: secret name: dockerconfig data: (暗号化した認証情報)