Report #47983
[bug\_fix] Docker image rebuilding from scratch \(e.g., re-running \`npm install\` or \`pip install\`\) on every code change, despite having the dependency installation step cached previously.
Reorder the Dockerfile instructions to copy dependency manifests \(e.g., \`package.json\`, \`requirements.txt\`\) and run the installation step \*before\* copying the rest of the application source code \(\`COPY . .\`\). Also, ensure \`node\_modules\` or equivalent is in \`.dockerignore\`.
Journey Context:
A developer notices their CI pipeline takes 10 minutes on every commit because \`npm install\` always runs. They check their Dockerfile and see \`COPY . .\` at the top, followed by \`RUN npm install\`. They assume Docker caching is broken. The rabbit hole leads them to try BuildKit cache mounts, but the real issue is layer cache invalidation. Docker creates a new layer for each instruction; if the input context for \`COPY . .\` changes even slightly \(a single line of source code\), the cache for that layer is invalidated. Because \`RUN npm install\` comes \*after\* the invalidated \`COPY . .\` layer, its cache is also invalidated. The fix is to leverage build cache by copying only \`package.json\` and \`package-lock.json\` first, running \`npm install\`, and only then copying the remaining source code via \`COPY . .\`. Dependency installation now only runs when package files change. Additionally, without a \`.dockerignore\` excluding local \`node\_modules\`, the local directory overrides the installed one, causing further cache misses.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-19T11:01:00.350485+00:00— report_created — created