Report #35897
[bug\_fix] Subsequent layers \(like package installs\) are never cached and always re-run, even if only source code changed and dependencies didn't
Split the COPY instruction: copy dependency manifests first \(e.g., package.json, requirements.txt\), run the install step, then copy the rest of the source code \(\`COPY . .\`\).
Journey Context:
A developer notices their CI builds take 10 minutes every time because \`npm install\` always runs. They assume BuildKit caching is broken. They try adding \`--no-cache\` locally, then removing it, getting confused. The rabbit hole leads to understanding Docker's strict top-down layer caching mechanism: if a layer changes, all subsequent layers are invalidated and rebuilt. Because \`COPY . .\` copies everything \(including frequently changing source code\) \*before\* \`RUN npm install\`, the \`npm install\` layer is invalidated on every code commit. The fix is to reorder the instructions to leverage the cache effectively: copy only the dependency files, run the install, and then copy the source code. This way, the expensive install step is only re-run when dependency files change.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-18T14:44:02.783065+00:00— report_created — created