Problem
Docker Agent maintains documentation in two places that drift apart:
Because the docs.docker.com pages are hand-authored duplicates, they drift every time the product-repo docs are updated. There is no automated link between the two.
Solution: join the pattern every other Docker product already uses
docker/docs already single-sources product documentation via Hugo module mounts pinned to release tags. Six products are already wired in today:
| Product |
go.mod pin |
| Docker CLI |
github.com/docker/cli v29.6.0 |
| Buildx |
github.com/docker/buildx v0.35.0 |
| Compose |
github.com/docker/compose/v5 v5.2.0 |
| Model Runner |
github.com/docker/model-runner v1.1.36 |
| BuildKit |
github.com/moby/buildkit |
| Moby API |
github.com/moby/moby/api |
docker-agent is the only outlier. The fix is to join this pattern.
Architecture: one source, two surfaces
docker/docker-agent/docs/ ← SINGLE SOURCE OF TRUTH (written once)
│
├─── builds from HEAD of main ──────────▶ github.io/docker-agent
│ "Edge / preview" docs
│ Tracks main, may show unreleased features
│ Banner links to docs.docker.com
│
└─── Hugo module mount, pinned to release ▶ docs.docker.com/manuals/ai/docker-agent
"Stable / authoritative" docs
Curated subset, auto-bumped on release
No page authored twice
How it works:
docker/docs go.mod adds github.com/docker/docker-agent vX.Y.Z as a module dependency
hugo.yaml module.imports maps docs/** → content/manuals/ai/docker-agent
- On each docker-agent release, a bot PR bumps the version pin — docs.docker.com updates automatically
- A
docs-upstream.yml in this repo calls docker/docs' reusable validate-upstream.yml — docs PRs that would break docs.docker.com fail CI before merging
Open decisions (needed before Phase 1)
Implementation checklist
Phase 0 — Decisions (blocks everything else)
Phase 1 — Make the source mountable
Phase 2 — Wire the mount and automation
Phase 3 — Stable/preview UX and SEO
Phase 4 — Converge renderers (recommended fast-follow)
Minimum viable outcome
Phases 1–2 eliminate duplication and stop drift with no ongoing manual work. Phases 3–4 improve UX/SEO and achieve true byte-level single source.
References
- docker/docs
go.mod — declares upstream module dependencies
- docker/docs
sync-cli-docs.yml — model for the release-bump workflow
- docker/docs
validate-upstream.yml — reusable upstream validation workflow
- Buildx
docs-upstream.yml / Compose docs-upstream.yml — model for the product-side CI hook
Problem
Docker Agent maintains documentation in two places that drift apart:
docker/docker-agent/docs/→ published at https://docker.github.io/docker-agent/ (Jekyll/GitHub Pages, 85 files, tracksmain, comprehensive but may describe unreleased features)docker/docs/content/manuals/ai/docker-agent/→ published at https://docs.docker.com/manuals/ai/docker-agent/ (Hugo, 17 hand-authored files, frequently outdated)Because the docs.docker.com pages are hand-authored duplicates, they drift every time the product-repo docs are updated. There is no automated link between the two.
Solution: join the pattern every other Docker product already uses
docker/docsalready single-sources product documentation via Hugo module mounts pinned to release tags. Six products are already wired in today:go.modpingithub.com/docker/cli v29.6.0github.com/docker/buildx v0.35.0github.com/docker/compose/v5 v5.2.0github.com/docker/model-runner v1.1.36github.com/moby/buildkitgithub.com/moby/moby/apidocker-agent is the only outlier. The fix is to join this pattern.
Architecture: one source, two surfaces
How it works:
docker/docsgo.modaddsgithub.com/docker/docker-agent vX.Y.Zas a module dependencyhugo.yamlmodule.importsmapsdocs/**→content/manuals/ai/docker-agentdocs-upstream.ymlin this repo calls docker/docs' reusablevalidate-upstream.yml— docs PRs that would break docs.docker.com fail CI before mergingOpen decisions (needed before Phase 1)
repository_dispatchfrom release workflow (tighter)?Implementation checklist
Phase 0 — Decisions (blocks everything else)
Phase 1 — Make the source mountable
relative_url), droppermalink:front matter, replace theme-specific HTML grids, addtitle/description/keywordsfront matter, use> [!NOTE]calloutsdocs/**Phase 2 — Wire the mount and automation
docker/docs:go.modrequire entry,hugo.yamlmodule.imports map, vendor into_vendor/, replace the 17 hand-authored pages with mounted equivalents (preservealiasesso URLs don't break)docs-upstream.ymlin this repo calling docker/docs' reusablevalidate-upstream.ymldocker/docsbumping the version pin on each new release tag)Phase 3 — Stable/preview UX and SEO
rel=canonicalon github.io mirrored pages pointing to docs.docker.com equivalentsComing in vX.Y)Phase 4 — Converge renderers (recommended fast-follow)
Minimum viable outcome
Phases 1–2 eliminate duplication and stop drift with no ongoing manual work. Phases 3–4 improve UX/SEO and achieve true byte-level single source.
References
go.mod— declares upstream module dependenciessync-cli-docs.yml— model for the release-bump workflowvalidate-upstream.yml— reusable upstream validation workflowdocs-upstream.yml/ Composedocs-upstream.yml— model for the product-side CI hook