Docker Hub have been incrementally increasing rate limits for “Docker image pulls” over recent years, starting in 2020, and further changes are being applied from April 1st, 2025.
You can read more about Docker Rate limits here:
Usage and limits
The way these rate limits are implemented are that “anonymous” or unauthenticated image pulls are subject to rate limits on a per source IP basis.
As you may be aware, Bitbucket Pipelines operates on a pool of shared IP ranges, and is therefore subject to rate limits from Docker Hub.
We recommend to our customers who wish to continue to reliably use Docker Hub services to authenticate their traffic with an appropriate service tier based on your usage, as this shifts the rate limit from source IP, to source user.
See examples below of authenticating with Docker Hub, you can read more in our documentation:
Use Docker images as build environments | Bitbucket Cloud | Atlassian Support
<span data-testid="renderer-code-block-line-2" data-ds--code--row=""><br>definitions:
</span><span data-testid="renderer-code-block-line-3" data-ds--code--row=""> services: ## authenticated service container
</span><span data-testid="renderer-code-block-line-4" data-ds--code--row=""> my-service-name:
</span><span data-testid="renderer-code-block-line-5" data-ds--code--row=""> image:
</span><span data-testid="renderer-code-block-line-6" data-ds--code--row=""> name: alpine:latest
</span><span data-testid="renderer-code-block-line-7" data-ds--code--row=""> username: $DOCKER_USERNAME
</span><span data-testid="renderer-code-block-line-8" data-ds--code--row=""> password: $DOCKER_PASSWORD
</span><span data-testid="renderer-code-block-line-9" data-ds--code--row="">pipelines:
</span><span data-testid="renderer-code-block-line-10" data-ds--code--row=""> default:
</span><span data-testid="renderer-code-block-line-11" data-ds--code--row=""> - step:
</span><span data-testid="renderer-code-block-line-12" data-ds--code--row=""> image:
</span><span data-testid="renderer-code-block-line-13" data-ds--code--row=""> name: customers_image_name # for build image
</span><span data-testid="renderer-code-block-line-14" data-ds--code--row=""> username: $DOCKER_USERNAME
</span><span data-testid="renderer-code-block-line-15" data-ds--code--row=""> password: $DOCKER_PASSWORD
</span><span data-testid="renderer-code-block-line-16" data-ds--code--row=""> script:
</span><span data-testid="renderer-code-block-line-17" data-ds--code--row=""> - docker login -u $DOCKER_USERNAME -p $DOCKER_PASSWORD # for pipes or dind
</span><span data-testid="renderer-code-block-line-18" data-ds--code--row=""> - step:
</span><span data-testid="renderer-code-block-line-19" data-ds--code--row=""> name: Using a Service Container
</span><span data-testid="renderer-code-block-line-20" data-ds--code--row=""> services:
</span><span data-testid="renderer-code-block-line-21" data-ds--code--row=""> - my-service-name
</span><span data-testid="renderer-code-block-line-22" data-ds--code--row=""> script:
</span><span data-testid="renderer-code-block-line-23" data-ds--code--row=""> - echo "Hello, World"
</span>
We’d like to remind our users that your choice of Docker Package repository is not restricted to Docker Hub, and that there are a variety of commercial and self-hosted alternatives.
Pipelines will continue to review it’s choice of image hosting provider going forward; Consider voting on this issue if you’re interested in a Bitbucket native solution:
https://jira.atlassian.com/browse/BCLOUD-19547