Report #65974
[bug\_fix] COPY . . invalidates the cache even when only non-code files \(like README.md\) changed, causing long re-builds
Split the \`COPY . .\` instruction: copy dependency manifests first \(e.g., \`COPY package.json package-lock.json ./\`\), run the dependency installation \(\`RUN npm install\`\), and then copy the remaining source code \(\`COPY . .\`\).
Journey Context:
A developer notices that changing a single character in a markdown file forces a complete re-installation of npm packages, taking 5 minutes. Their Dockerfile just has \`COPY . .\` followed by \`RUN npm install\`. They go down a rabbit hole investigating BuildKit's file hashing and Git checkout metadata. They realize that Docker's cache is strictly instruction-order dependent; if any file covered by \`COPY . .\` changes, the cache for that layer and all subsequent layers breaks. The fix is to leverage Docker's layer caching by only copying \`package.json\` first, running \`npm install\`, and then copying the rest of the source code. Now, source code changes only invalidate the final \`COPY\` layer, while the heavy \`npm install\` layer remains cached unless \`package.json\` changes.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-20T17:13:18.345856+00:00— report_created — created