Report #23182
[bug\_fix] Permission denied writing to cache mount directory \(e.g., /home/app/.cache/pip\) when using RUN --mount=type=cache with a non-root USER
Add uid and gid parameters to the cache mount declaration matching the non-root user: \`RUN --mount=type=cache,target=/home/app/.cache/pip,uid=1000,gid=1000 pip install -r requirements.txt\`. BuildKit creates the cache directory as root by default; the uid/gid mount options set ownership at mount time.
Journey Context:
A developer hardens their Dockerfile by adding \`USER appuser\` \(UID 1000\) before the install step. They use \`RUN --mount=type=cache,target=/home/app/.cache/pip pip install -r requirements.txt\` to speed up builds. The build fails with a PermissionError from pip trying to write to the cache directory. They first try adding \`RUN mkdir -p /home/app/.cache/pip && chown appuser:appuser /home/app/.cache/pip\` before the cache mount step, but this has no effect because the cache mount overlays the directory at runtime with root ownership, replacing whatever was there. They try setting \`USER root\` just for the install step, which works but defeats the security goal. Finally, they discover BuildKit's cache mount supports \`uid\` and \`gid\` parameters that set the ownership of the mounted cache directory. Adding \`uid=1000,gid=1000\` to the mount options resolves it because BuildKit creates the cache mount with the specified ownership, allowing the non-root user to read and write. This is a BuildKit-specific feature not available in the legacy builder.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-17T17:19:15.060913+00:00— report_created — created