Summary
On hub.docker.com/_/<image>, the header icon of every Docker Official Image renders as the generic Docker "box" placeholder instead of the repository logo. The logo itself is present and correct in Docker Hub's own store — the media API serves it, and the search API returns it, which is why the same image does show its logo on the search and Explore pages.
So the asset is fine, and the upload pipeline in docker-library/docs/push.pl is fine; only the repository detail page fails to render it.
Steps to reproduce
- Open https://hub.docker.com/search?badges=official&q=nginx — the result card shows the nginx logo.
- Click through to https://hub.docker.com/_/nginx — the header shows the generic Docker box placeholder.
Expected: the repository page header shows the same logo the search result shows.
Actual: it shows the namespace/default placeholder.
Scope
Not specific to one image. Reproduced on:
Verified Publisher pages are unaffected — https://hub.docker.com/r/datadog/agent renders its logo in that same header slot, so the component works; it just gets no logo for library/ repos.
Evidence: Hub has the logo
The media API returns each logo, 302ing to a valid 120×120 PNG:
$ curl -sS -o /dev/null -w '%{http_code} -> %{redirect_url}\n' \
'https://hub.docker.com/api/media/repos_logo/v1/library%2Fnginx'
302 -> https://djeqr6to3dedg.cloudfront.net/repo-logos/library/nginx/live/logo-1763770349851.png
$ curl -sS -o /dev/null -w '%{http_code} -> %{redirect_url}\n' \
'https://hub.docker.com/api/media/repos_logo/v1/library%2Fazul-zulu'
302 -> https://djeqr6to3dedg.cloudfront.net/repo-logos/library/azul-zulu/live/logo-1773781879448.png
The search API returns it too:
$ curl -sS 'https://hub.docker.com/api/search/v4?query=nginx&badges=official' | jq '.results[0].logo_url'
{
"large": "https://djeqr6to3dedg.cloudfront.net/repo-logos/library/nginx/live/logo-1763770349851.png",
"small": "https://djeqr6to3dedg.cloudfront.net/repo-logos/library/nginx/live/logo-1763770349851.png"
}
Likely cause: the two APIs disagree
The repository detail endpoint reports no logo at all, for every Official Image:
$ for r in nginx redis eclipse-temurin azul-zulu; do
printf '%s: ' "$r"
curl -sS "https://hub.docker.com/v2/repositories/library/$r/" | jq -c '.logo_url'
done
nginx: null
redis: null
eclipse-temurin: null
azul-zulu: null
If the repository page reads logo_url from /v2/repositories/{namespace}/{name}/ while search reads it from the v4 search index, that null is enough to explain the placeholder. Populating logo_url on the repositories endpoint from the same source the search index uses (or having the page fall back to /api/media/repos_logo/v1/{namespace}%2F{name}) would fix it.
Notes
- The
%%LOGO%% image inside the description body still renders — it is served from raw.githubusercontent.com and is unrelated to the header icon. Only the header avatar is affected.
- Not a
docker-library/docs content problem: the affected repos all have a valid logo.png/logo.svg committed, and push.pl has clearly uploaded them (see the media API responses above).
Tested 2026-09-09.
Summary
On
hub.docker.com/_/<image>, the header icon of every Docker Official Image renders as the generic Docker "box" placeholder instead of the repository logo. The logo itself is present and correct in Docker Hub's own store — the media API serves it, and the search API returns it, which is why the same image does show its logo on the search and Explore pages.So the asset is fine, and the upload pipeline in
docker-library/docs/push.plis fine; only the repository detail page fails to render it.Steps to reproduce
Expected: the repository page header shows the same logo the search result shows.
Actual: it shows the namespace/default placeholder.
Scope
Not specific to one image. Reproduced on:
Verified Publisher pages are unaffected — https://hub.docker.com/r/datadog/agent renders its logo in that same header slot, so the component works; it just gets no logo for
library/repos.Evidence: Hub has the logo
The media API returns each logo, 302ing to a valid 120×120 PNG:
The search API returns it too:
Likely cause: the two APIs disagree
The repository detail endpoint reports no logo at all, for every Official Image:
If the repository page reads
logo_urlfrom/v2/repositories/{namespace}/{name}/while search reads it from the v4 search index, that null is enough to explain the placeholder. Populatinglogo_urlon the repositories endpoint from the same source the search index uses (or having the page fall back to/api/media/repos_logo/v1/{namespace}%2F{name}) would fix it.Notes
%%LOGO%%image inside the description body still renders — it is served fromraw.githubusercontent.comand is unrelated to the header icon. Only the header avatar is affected.docker-library/docscontent problem: the affected repos all have a validlogo.png/logo.svgcommitted, andpush.plhas clearly uploaded them (see the media API responses above).Tested 2026-09-09.