GitHub Actions:「You have reached your unauthenticated pull rate limit」
ランナーのアドレスからの匿名の取得が多すぎたので、Docker Hub がイメージを渡すのを断りました。GitHub Actions に特有なのは、取得がどこで起きるかです。services:・container:・Docker のアクションのイメージは最初のステップより前に取得されるので、docker/login-action のステップはそれらには何もしません。ワークフローそのものに認証情報を書くか、同じイメージをほかのレジストリから取ります。
見え方
Error response from daemon: toomanyrequests: You have reached your unauthenticated pull rate limit. ##[error]Docker pull failed with exit code 1
- サービスやコンテナのジョブでは、ランナーは数秒あけて3回取得を試し、どのステップよりも前の Initialize containers でジョブを失敗にします(ContainerOperationProvider.cs)。homeboy のワークフローを使うプロジェクトの1つでは、2026年10月9日にレビューのジョブが3回の実行ですべてこれで失敗し(#17014)、regelrecht では4つのプルリクエストがマージキューから外れました(#1702)。
- メッセージの「unauthenticated」は、ログインしていなかった証拠にはなりません。ログインした Personal のアカウントが自分の上限を超えたときも、Docker Hub は同じ文を返します(docker/hub-feedback #2537・開いたまま)。
何回まで取得できるか
Docker のドキュメントでは、6時間あたり、匿名の取得は IPv4 のアドレスか IPv6 の /64 のサブネットごとに100回、Docker Personal のアカウントは200回、Pro・Team・Business は上限なしです。2026年11月3日に匿名で確かめたとき、Docker Hub が返したヘッダーは ratelimit-limit: 100;w=3600、つまり1時間に100回でした。Docker のドキュメントは、外部のプラットフォームが同じアドレスで多くの利用者の取得をすることがあるとも書いていて、homeboy の報告は失敗の原因をランナーどうしでアドレスを分け合っていることに置いています。ジョブの中から数を見るには、取得に数えられない HEAD のリクエストを使います:
- run: |
TOKEN=$(curl -s "https://auth.docker.io/token?service=registry.docker.io&scope=repository:ratelimitpreview/test:pull" | jq -r .token)
curl -s --head -H "Authorization: Bearer $TOKEN" \
https://registry-1.docker.io/v2/ratelimitpreview/test/manifests/latest | grep -i ratelimit
1. それぞれの取得がどこで起きるか
services:とcontainer::ステップより前の Initialize containers で。credentials:を書きます(2)。- Docker のアクション(
uses: docker://…、またはaction.ymlがイメージか Dockerfile を動かすアクション):ランナーがあなたのステップの前に足す、「Pull …」や「Build …」という名前のステップで(ActionManager.cs)。認証情報を書く設定はありません。ほかのレジストリにあるイメージの写しを使うか(3)、ログインのステップのあとで自分でdocker runします。 - 自分のステップの
docker pull・docker run・docker compose・docker build(docker/build-push-actionも):その前にdocker/login-actionのステップを置けば効きます。
2. 効く場所でログインする
jobs:
test:
runs-on: ubuntu-latest
services:
postgres:
image: postgres:16
credentials:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
steps:
- uses: docker/login-action@v4
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- run: docker compose up -d
- パスワードには、読み取りだけの Docker Hub の personal access token を使います。
- フォークからのプルリクエストの実行にはシークレットが渡らず、Dependabot の実行には Dependabot のシークレットしか渡りません。そこでは
credentials:の2つの値が空になり、ワークフローのスキーマは空のusernameやpasswordを受け付けないので、ジョブはどのステップよりも前の Set up job で「The template is not valid ... Unexpected value ''」になって失敗します(eshu #7948)。curia は、シークレットが無いときに空のマッピングになる1つの式でそれぞれのブロックを書きました(#2158)。そうした実行は匿名で取得し、アドレスの回数を使います(「The template is not valid」):credentials: ${{ secrets.DOCKERHUB_USERNAME && secrets.DOCKERHUB_TOKEN && fromJSON(format('{{"username":{0},"password":{1}}}', toJSON(secrets.DOCKERHUB_USERNAME), toJSON(secrets.DOCKERHUB_TOKEN))) || fromJSON('{}') }} - 1つの Personal のアカウントをたくさんのジョブで使うと、そちらも使い切ることがあります。Docker の有料のプランには取得の上限がありません。
3. 同じイメージをほかのレジストリから取る
public.ecr.aws/docker/library/postgres:16:Amazon ECR Public にある Docker Official Images です。regelrecht はサービスを1行の変更でこれに替えて直しました(#1702)。mirror.gcr.io/library/postgres:16:Google のドキュメントには、Artifact Registry は「caches frequently-accessed public Docker Hub images on mirror.gcr.io」(よく取得される公開の Docker Hub のイメージを mirror.gcr.io にキャッシュする)とあります。取得する人の少ないイメージは無いことがあります。ghcr.ioに置いた自分の写し:credentials:にgithub.actorとsecrets.GITHUB_TOKENを書き、packages: readをつけて取ります。homeboy は MySQL のサービスにこれを提案しました(#17014)。
上の2つの公開の写しは、2026年11月3日に postgres:16 を返しました。イメージをダイジェストで固定しているなら、写しのダイジェストが同じかを確かめます。
見分け方
- それ以上の文の無い
429 Too Many Requests:Docker Hub の abuse limit で、ログインの有無にかかわらず、アドレスごとに全員に数えられます。ログインしても変わりません。待ってやり直します。 pull access denied for …, repository does not exist or may require 'docker login':名前が違うか、イメージが非公開です。- Bitbucket Pipelines での同じメッセージは、ログインする場所が違います:Bitbucket Pipelines と Docker Hub の上限。
失敗したジョブを IntelliJ IDEA から見るなら
Pipeline Inbox for GitHub Actions Workflows は、Lesstep が作っている JetBrains IDE(2024.1 以降)のプラグインです。すべてのリポジトリの実行を、ジョブ・ステップと一緒に IDE のツールウィンドウに並べ、いまのブランチの実行はステータスバーに出ます。読むのは無料、失敗したジョブの再実行・キャンセル・ワークフローの実行・デプロイのレビューは Pro(月 US$1.50・30日の無料試用つき)です。
GitHub・GitHub Actions は GitHub, Inc. の商標、Docker・Docker Hub は Docker, Inc. の商標、IntelliJ IDEA は JetBrains s.r.o. の商標です。このページは GitHub, Inc.・Docker, Inc.・JetBrains のいずれとも提携しておらず、承認も受けていません。
ほかに:ghcr.io の「permission_denied: write_package」 · 「detected dubious ownership」 · 「No space left on device」 · IntelliJ IDEA で使える GitHub Actions のプラグインの比較 · English