OpenShift pod报EACCES创建.cache目录权限错误如何解决?
问题根因
- OpenShift默认使用无特权的随机UID运行容器,该UID默认属于gid为0的root用户组,仅拥有root组分配的权限,无法操作仅root用户可写的文件/目录
- 你原Dockerfile中权限调整命令在
npm install之前执行,npm install生成的node_modules目录及子文件由root用户创建,未继承之前设置的组可写权限,因此随机UID运行的进程无法写入node_modules/.cache目录
修复方案(无需修改SCC)
方案1:调整Dockerfile权限配置顺序(最推荐)
所有文件操作执行完成后,统一给目录分配root组可写权限,修改后的Dockerfile如下:
FROM node:14.18.0-alpine WORKDIR /usr/src/app # 先复制代码、执行依赖安装 COPY . /usr/src/app RUN npm install # 所有文件操作完成后,统一给整个应用目录分配root组可写权限 RUN chgrp -R 0 /usr/src/app \ && chmod -R g=u /usr/src/app \ # 提前创建npm缓存目录并赋权,避免运行时生成报错 && mkdir -p /usr/src/app/node_modules/.cache \ && chmod g+w /usr/src/app/node_modules/.cache EXPOSE 4308
方案2:修改npm缓存路径到全局可写目录
将npm缓存路径指定到默认全局可写的/tmp目录,无需修改目录权限,可直接在启动命令中添加参数,或者写入Dockerfile:
- 启动命令调整为:
npm config set cache /tmp/.npm && npm run build && PORT=4308 NODE_TLS_REJECT_UNAUTHORIZED=0 NODE_ENV=uat node server
- 也可直接在Dockerfile中添加全局npm配置:
RUN npm config set cache /tmp/.npm --global
方案3:配置npm以避免生成运行时缓存
如果不需要构建缓存,可添加--no-cache参数禁用npm缓存,启动命令调整为:
npm run build --no-cache && PORT=4308 NODE_TLS_REJECT_UNAUTHORIZED=0 NODE_ENV=uat node server
内容的提问来源于stack exchange,提问作者sr ramu
相关产品推荐
相关产品推荐

