Docker环境下pnpm使用非root用户报Permission Denied如何解决
解决方案
你遇到的权限问题核心有两个原因:
- pnpm默认的全局依赖存储路径属于root用户,非特权的app用户无写入权限
- 切换到pnpm后的Dockerfile省略了COPY操作的
--chown=app:app赋权,也没有切换到app用户执行后续操作
修改后的可正常运行的Dockerfile如下:
FROM node:14.17.3-slim # build args ARG NPM_AUTH_TOKEN ARG HOME=/home/app ARG NPMRC_PATH=$HOME/.npmrc # 安装系统依赖和pnpm(root权限执行即可) RUN apt-get update && apt-get install -y curl \ && rm -rf /var/lib/apt/lists/* RUN curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm # 保留你需要的非特权用户配置 RUN useradd -Umrd $HOME app WORKDIR $HOME # 配置pnpm的存储路径到app用户的home目录,避免访问root路径 ENV PNPM_STORE_PATH=$HOME/.pnpm-store USER app # copy配置时增加赋权,和你之前npm的配置逻辑一致 COPY --chown=app:app "bin" "bin" COPY --chown=app:app "package.json" "pnpm-lock.yaml" "webpack.config.js" ".babelrc" ./ RUN ./bin/write_npmrc && \ pnpm install --frozen-lockfile ENV NODE_ENV=development VOLUME ["$HOME/config", "$HOME/log", "$HOME/src"] CMD ["pnpm", "start"] EXPOSE 9000
关键修改说明
- 全局安装pnpm的操作保留用root执行,无需修改权限
- 新增
PNPM_STORE_PATH环境变量,指定pnpm的依赖缓存存储到app用户的home目录下,避免访问root用户的默认存储路径触发权限错误 - 所有COPY操作都增加
--chown=app:app参数,确保复制的文件归属app用户所有 - 保留了你要求的完整非特权用户配置,从依赖安装到服务运行全程使用app用户执行,符合安全要求
如果运行时还是有零星权限报错,可以在创建完app用户后、切换用户前,额外增加一行RUN命令给pnpm的全局执行路径赋权即可:
RUN chown -R app:app /usr/local/lib/node_modules/pnpm
内容的提问来源于stack exchange,提问作者Mugetsu
相关产品推荐
相关产品推荐

