Docker Node容器中因root权限文件导致npm无法运行dev命令
Docker Node容器中npm run development权限问题解决方案
问题场景
执行npm run development时触发权限拒绝错误,核心问题是无法访问/root/.npm目录下的文件/文件夹,具体错误日志如下:
Creating api_node_run ... done > dev > npm run development npm WARN logfile Error: EACCES: permission denied, scandir '/root/.npm/_logs' npm WARN logfile error cleaning log files [Error: EACCES: permission denied, scandir '/root/.npm/_logs'] { npm WARN logfile errno: -13, npm WARN logfile code: 'EACCES', npm WARN logfile syscall: 'scandir', npm WARN logfile path: '/root/.npm/_logs' npm WARN logfile } > development > mix npm ERR! code EACCES npm ERR! syscall mkdir npm ERR! path /root/.npm/_cacache/tmp npm ERR! errno -13 npm ERR! npm ERR! Your cache folder contains root-owned files, due to a bug in npm ERR! previous versions of npm which has since been addressed. npm ERR! npm ERR! To permanently fix this problem, please run: npm ERR! sudo chown -R 1000:33 "/root/.npm" npm ERR! Log files were not written due to an error writing to the directory: /root/.npm/_logs npm ERR! You can rerun the command with `--loglevel=verbose` to see the logs in your terminal npm notice npm notice New major version of npm available! 8.19.4 -> 10.2.5 npm notice Changelog: https://github.com/npm/cli/releases/tag/v10.2.5 npm notice Run npm install -g npm@10.2.5 to update! npm notice
相关配置
docker-compose.yml:
node: image: connectedplaces/api/node build: context: ./docker/node dockerfile: Dockerfile volumes: - .:/var/www/html
Dockerfile:
# Set base image. FROM node:16.20 # Install git for faster package downloads. RUN apt-get install -y git RUN chown -R node:node /root/.npm # Set the working directory to the project root. WORKDIR /var/www/html
权限检查结果
执行docker-compose run --rm --entrypoint "" node ls -lart /root/.npm输出:
drwxr-xr-x 1 node node 4096 Sep 7 22:33 _logs drwx------ 1 root root 4096 Sep 7 22:33 .. drwxr-xr-x 1 node node 4096 Sep 7 22:33 .
已尝试方案:参考相关解决方案、删除镜像重建、升级Node版本重建,问题未解决。
下一步处理方案
1. 容器内直接修正权限
进入容器执行权限修改命令,确保/root/.npm下所有文件/文件夹归node用户所有:
docker-compose run --rm --entrypoint "" node chown -R node:node /root/.npm
执行完成后重新运行npm run development。
2. 切换到node用户运行容器
Node官方镜像默认以root用户运行,易引发缓存目录权限问题。修改Dockerfile添加USER node指令,让容器以node用户启动:
# Set base image. FROM node:16.20 # Install git for faster package downloads. RUN apt-get install -y git # 提前创建.npm目录并设置权限(避免目录不存在导致的权限异常) RUN mkdir -p /root/.npm && chown -R node:node /root/.npm # 切换到node用户 USER node # Set the working directory to the project root. WORKDIR /var/www/html
重建镜像并重启容器:
docker-compose build node docker-compose up -d
3. 自定义npm缓存目录
若不想修改运行用户,可指定npm使用非root路径作为缓存目录,修改Dockerfile添加环境变量:
# Set base image. FROM node:16.20 # Install git for faster package downloads. RUN apt-get install -y git # 创建项目内的缓存目录并赋予node用户权限 RUN mkdir -p /var/www/html/.npm-cache && chown -R node:node /var/www/html/.npm-cache # 设置npm缓存路径 ENV npm_config_cache=/var/www/html/.npm-cache # Set the working directory to the project root. WORKDIR /var/www/html
此方案让npm使用项目目录下的.npm-cache作为缓存,规避root目录权限限制。
4. 检查本地挂载目录权限
由于挂载了本地目录./:/var/www/html,需确保本地目录权限适配容器内node用户:
# 本地执行,修改目录权限(1000为node用户UID,33为www-data组GID) sudo chown -R 1000:33 ./
内容的提问来源于stack exchange,提问作者AppSol
相关产品推荐
相关产品推荐

