在OpenShift上通过Dockerfile部署Create React App遇权限错误求助
解决OpenShift部署Create React App时的ESLint缓存权限拒绝问题
问题背景
我尝试使用Dockerfile在OpenShift上部署Create React App应用,OpenShift构建过程显示成功,但访问应用路由时,应用仅运行1秒就弹出编译失败错误:
Failed to compile EACCES: permission denied, open '/home/node/app/.eslintcache'
我原本已经在Dockerfile中为node镜像默认的node用户配置了目标目录的权限,但始终无法定位权限拒绝的原因。初始Dockerfile如下:
FROM node:14-alpine RUN mkdir -p /home/node/app &&\ chmod -R 775 /home/node/app &&\ chown -R node:node /home/node/app WORKDIR /home/node/app COPY package*.json /home/node/app/ USER node RUN npm install COPY --chown=node:node . /home/node/app EXPOSE 3000 CMD ["npm", "start"]
相关环境版本:
- react-scripts: 4.0.1
- OpenShift: 4.2、4.4、4.5(均已测试)
问题根源与解决方案
经过排查,发现OpenShift的容器运行机制是关键:OpenShift会以属于组0(root组)的随机用户ID来运行容器,而不是我们指定的用户名。这就导致即使我们给node用户配置了权限,实际运行容器的用户也没有对应的读写权限。
针对这个特性,我们需要调整Dockerfile,给组0配置目录的读写执行权限,同时指定用户ID而非用户名来运行。修正后的Dockerfile如下:
FROM node:14-alpine RUN mkdir -p /home/node/app &&\ chown -R node:node /home/node/app WORKDIR /home/node/app # 给root组配置目录读写执行权限 RUN chgrp -R 0 /home/node/app &&\ chmod -R g+rwX /home/node/app COPY package*.json /home/node/app/ # 使用用户ID而非用户名运行容器 USER 1000 RUN npm install COPY --chown=node:node . /home/node/app EXPOSE 3000 CMD ["npm", "start"]
这个调整后,容器运行时的随机用户会通过组0的权限获取到.eslintcache文件的读写权限,从而解决编译失败的问题。
内容的提问来源于stack exchange,提问作者Abhijeet Singh
相关产品推荐
相关产品推荐

