Report #90230
[bug\_fix] RUN --mount=type=cache does not persist cache across builds in CI, or cache collisions occur between different branches
Specify a unique \`id\` for the cache mount \(e.g., \`--mount=type=cache,id=pip-cache,target=/root/.cache/pip\`\) and ensure the CI runner is configured to persist the BuildKit cache storage backend \(e.g., using \`--cache-to\` and \`--cache-from\` with a remote backend, or preserving the local BuildKit cache directory\).
Journey Context:
A developer switches to BuildKit to use \`--mount=type=cache\` for pip/npm to speed up CI. Locally it works great, but in GitHub Actions or GitLab CI, dependencies are downloaded every time. They think BuildKit is a lie. The rabbit hole leads them to realize that \`type=cache\` defaults to local storage on the BuildKit daemon, but in ephemeral CI environments, the daemon is destroyed after the job. To persist it, they must use a persistent cache backend. Furthermore, they discover cache collisions when multiple Dockerfiles cache to the same target path, causing bizarre dependency conflicts. Adding a unique \`id\` parameter isolates the cache scope, and configuring \`--cache-to=type=local,mode=max\` with CI artifact persistence ensures the cache survives between runs.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-22T10:02:44.522153+00:00— report_created — created