如何为非root用户使用Docker BuildKit缓存挂载?
尝试为以非root用户运行的Python镜像使用BuildKit的cache mounts功能,root用户构建时无异常,但切换到普通用户构建时,pip抛出缓存权限警告,无法正常使用缓存挂载。
root用户构建示例(正常运行)
FROM python:3.12.4 ENV XDG_CACHE_DIR=/root/.cache RUN --mount=type=cache,target=/root/.cache \ pip install django
普通用户构建示例(出现权限警告)
FROM python:3.12.4 ENV HOME=/home/user RUN adduser --home "$HOME" \ --disabled-password \ --disabled-login \ user \ && chown -R user:user "$HOME" USER user ENV PATH="$HOME/.local/bin:$PATH" \ XDG_CACHE_DIR="$HOME/.cache" RUN --mount=type=cache,target=/home/user/.cache \ pip install --user django
触发的警告信息
WARNING: The directory '/home/user/.cache/pip' or its parent directory is not owned or is not writable by the current user. The cache has been disabled. Check the permissions and owner of that directory. If executing pip with sudo, you should use sudo's -H flag.
疑问:是否只有root用户构建时才能利用BuildKit的缓存挂载功能?
并非只有root用户才能使用BuildKit的cache mounts,问题根源是缓存挂载目录默认由root用户拥有,普通用户没有写入权限。以下两种方法可解决该问题:
方法一:挂载缓存时指定uid和gid
BuildKit的cache mount支持通过uid和gid参数直接指定目录的所有者,将其设置为普通用户的ID即可。修改后的Dockerfile如下:
FROM python:3.12.4 ENV HOME=/home/user RUN adduser --home "$HOME" \ --disabled-password \ --disabled-login \ user \ && chown -R user:user "$HOME" USER user ENV PATH="$HOME/.local/bin:$PATH" \ XDG_CACHE_DIR="$HOME/.cache" # 指定缓存目录的uid和gid为当前普通用户(默认创建的user uid/gid为1000) RUN --mount=type=cache,target=/home/user/.cache,uid=1000,gid=1000 \ pip install --user django
若不确定用户的uid/gid,可在构建阶段先执行id -u user和id -g user查看,多数场景下默认普通用户的uid/gid均为1000,直接使用即可。
方法二:提前以root身份初始化缓存目录权限
在切换到普通用户之前,先创建缓存目录并修改其所有者为普通用户,后续挂载缓存时即可正常写入:
FROM python:3.12.4 ENV HOME=/home/user RUN adduser --home "$HOME" \ --disabled-password \ --disabled-login \ user \ && mkdir -p "$HOME/.cache" \ && chown -R user:user "$HOME" USER user ENV PATH="$HOME/.local/bin:$PATH" \ XDG_CACHE_DIR="$HOME/.cache" RUN --mount=type=cache,target=/home/user/.cache \ pip install --user django
内容的提问来源于stack exchange,提问作者kojiro

