📝

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

2021/04/25に公開

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 する。

参考)

手順

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

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

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

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

    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

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

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

参考) Secrets - Encrypted

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

  1. Drone で暗号化する。

    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 に追記する。

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

Discussion