| title | Docker Image Pull Failed | |||||
|---|---|---|---|---|---|---|
| slug | docker-image-pull-failed | |||||
| technologies |
|
|||||
| severity | high | |||||
| tags |
|
|||||
| related |
|
|||||
| last_reviewed | 2026-06-27 |
Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
failed to resolve reference "registry.example.com/app:1.2": failed to do request: Head "https://registry.example.com/v2/app/manifests/1.2": dial tcp 10.0.0.5:443: connect: connection refused
This is the general "the pull did not complete" failure, distinct from the precise
denied (auth) and manifest unknown (bad reference) cases. The daemon could not
fetch the image because of a transport-level problem: it couldn't reach the
registry, the TLS handshake failed, a rate limit was hit, or a layer download was
interrupted. The exact wrapped error (timeout, connection refused, x509,
toomanyrequests) tells you which.
- docker (registry client, host networking, TLS, proxy)
high — workloads that need a fresh image can't start or update, which blocks deploys and autoscaling. If the image is already cached, running containers are unaffected.
- Network/DNS/firewall blocks reaching the registry (proxy or egress rules).
- Docker Hub anonymous rate limit (
toomanyrequests). - TLS/cert failure against a private registry (
x509: certificate signed by unknown authority). - Registry is down or overloaded; layer download times out mid-pull.
- Local disk fills during extraction (see no space left on device).
The daemon first does a HEAD/GET on /v2/ to negotiate, then fetches the
manifest and pulls layers. A failure at the connection stage (dial tcp,
timeout, connection refused) is networking/registry availability; an x509
error is trust configuration; 429 toomanyrequests is rate limiting; an ENOSPC
mid-extract is local disk. Reading the wrapped Go HTTP error in the daemon log
pinpoints which layer is responsible.
# The full wrapped transport error from the daemon
journalctl -u docker --no-pager -n 50
# Can the host even reach the registry endpoint?
curl -sSI https://registry-1.docker.io/v2/ | head
# DNS resolution for the registry host
getent hosts registry.example.com
# Disk headroom for extraction (rules out ENOSPC masquerading as a pull failure)
df -h /var/lib/docker$ curl -sSI https://registry-1.docker.io/v2/
HTTP/1.1 401 Unauthorized # reachable (401 is normal here) -> network OK
# Rate limited:
HTTP/1.1 429 Too Many Requests
# Unreachable:
curl: (7) Failed to connect to registry.example.com port 443: Connection refused
- For a network block, fix egress/DNS or configure the daemon's HTTP proxy in
/etc/systemd/system/docker.service.d/http-proxy.conf, thensystemctl daemon-reload && systemctl restart docker. - For Docker Hub
toomanyrequests, authenticate (docker login) to raise the limit, or pull through a registry mirror / private cache. - For
x509errors, install the registry CA into the host trust store (or/etc/docker/certs.d/<registry>/ca.crt) and restart the daemon. - For transient timeouts, retry; for
ENOSPC, prune disk (see related error).
docker pull registry.example.com/app:1.2
# Expect layers to download and "Status: Downloaded newer image" with no transport error.- Run a pull-through registry mirror to dodge Hub rate limits and reduce egress.
- Authenticate pulls in CI even for public images to get higher rate limits.
- Manage private-registry CAs via configuration management, not by hand.
- Alert on
/var/lib/dockerdisk so extraction never fails for space.
docker · registry · network · pull · production