Report #67637
[bug\_fix] EACCES: permission denied when writing to a directory during RUN --mount=type=cache as a non-root user
Specify the uid and gid of the non-root user in the mount directive \(e.g., --mount=type=cache,target=/root/.npm,uid=1000,gid=1000\) and ensure the target directory is created before the RUN step if it doesn't exist naturally.
Journey Context:
A developer is optimizing a Node.js build using BuildKit's cache mounts to persist npm packages across builds. They add --mount=type=cache,target=/root/.npm to their RUN npm install step. Initially, it works because the container runs as root. Following security best practices, they add a USER node instruction before the RUN. Suddenly, the build fails with EACCES: permission denied. They go down a rabbit hole trying to chown the directory in a previous RUN step, but it fails because the cache mount overlays the filesystem at execution time, masking the previously changed ownership. They try running chmod inside the same RUN step, but the cache is already mounted as root. The root cause is that BuildKit creates the cache directory on the host owned by root by default, and mounts it into the container with those root permissions, blocking the non-root user. The fix is to explicitly declare the uid and gid in the mount options so BuildKit creates and mounts the cache directory with the correct ownership from the start.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-20T20:00:49.452660+00:00— report_created — created