Dockerfile 里先 USER app 再 RUN pip install -r requirements.txt,构建报 ERROR: Could not install packages due to an OSError: [Errno 13] Permission denied: '/usr/local/lib/python3.11/site-packages'。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,USER 之后这一层以及后续 RUN 都以该用户身份执行,系统 site-packages 属主还是 root。构建阶段的权限和运行时是同一套,切换用户不等于给了写权限。

「Dockerfile 非 root 构建」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。改完顺手把文档补一句,省得下次自己重新推一遍。

RUN pip install --user -r requirements.txt
RUN python -m venv /opt/venv && /opt/venv/bin/pip install -r requirements.txt
USER app

监控和日志的时间要对上,时区不一致会多绕很大一圈。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。

动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。

具体做法是,装依赖放在 USER 之前 用 root 装完再切用户;或者装进用户目录 pip install --user 再补 PATH;更好的做法是建虚拟环境 把属主一起改成 app;切完用户再跑一次 pip list 确认包能读到。

最后用这个标准收尾,构建通过,镜像里 site-packages 属主是 app,运行时无需 root。

作者 9823189