Lesstep
GitHub Actions · Docker Hub · Checked November 3, 2026

GitHub Actions: "You have reached your unauthenticated pull rate limit"

Docker Hub refused an image because too many anonymous pulls had come from the runner's address. The part specific to GitHub Actions is where the pull happens. The images for services:, container: and Docker actions are pulled before your first step runs, so a docker/login-action step does nothing for them. They need credentials in the workflow itself, or the same image from another registry.

What it looks like

Error response from daemon: toomanyrequests: You have reached your unauthenticated pull rate limit.
##[error]Docker pull failed with exit code 1

How many pulls

Docker's documentation gives, per 6 hours: 100 for unauthenticated pulls, per IPv4 address or IPv6 /64 subnet; 200 for a Docker Personal account; no limit for Pro, Team and Business. The headers Docker Hub sent for an anonymous check on November 3, 2026 said ratelimit-limit: 100;w=3600, which is 100 per hour. Docker's documentation also notes that a third-party platform may use the same address to pull for many users, and homeboy's report puts its failures down to runners sharing addresses. To see the numbers from the job itself, with a HEAD request that does not count as a pull:

- 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. Where each pull happens

2. Log in where it counts

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

3. The same image from another registry

Both public copies above answered for postgres:16 on November 3, 2026. If you pin images by digest, check that the copy has the same digest.

Telling it apart

See failed jobs from IntelliJ IDEA

Pipeline Inbox for GitHub Actions Workflows, a plugin by Lesstep for JetBrains IDEs 2024.1 or later, lists the runs of all your repositories in an IDE tool window, with their jobs and steps, and your current branch's runs are in the status bar. Reading is free; re-running failed jobs, cancelling, running workflows and reviewing deployments are Pro (US$1.50 a month, with a 30-day trial).

GitHub and GitHub Actions are trademarks of GitHub, Inc.; Docker and Docker Hub are trademarks of Docker, Inc.; IntelliJ IDEA is a trademark of JetBrains s.r.o. This page is not affiliated with, sponsored or endorsed by GitHub, Inc., Docker, Inc. or JetBrains.

More: ghcr.io "permission_denied: write_package" · "detected dubious ownership" · "No space left on device" · GitHub Actions plugins for IntelliJ IDEA compared · 日本語