React应用Docker构建报错EACCES: permission denied mkdir '/app/node_modules/.cache'
问题根因
你遇到的EACCES: permission denied, mkdir '/app/node_modules/.cache'错误,核心原因是node:alpine官方镜像默认运行容器时使用非root的node用户,而Docker构建阶段执行npm install是root权限操作,生成的/app/node_modules目录所有者为root,运行时node用户没有写入权限创建缓存目录。
你之前在宿主机执行的所有chown改权限、重装node_modules的操作均无效,是因为你在docker-compose中声明了/app/node_modules为匿名卷,该目录完全运行在容器存储层,和宿主机目录无关,宿主机的修改不会影响容器内的目录权限。
解决方案
可任选以下任意一种方案解决:
方案1:调整Dockerfile配置(更安全,推荐生产/开发通用)
修改你的Dockerfile.dev内容如下,给node用户授予目录权限并切换为非root用户运行:
FROM node:alpine WORKDIR '/app' COPY package.json . RUN npm install \ # 给node用户授予node_modules目录读写权限 && chown -R node:node /app/node_modules COPY . . # 切换为node用户运行后续命令 USER node CMD ["npm", "run", "start"]
方案2:调整docker-compose配置(适合临时调试快速生效)
在docker-compose.yml的web服务配置中新增user: root参数,指定容器以root用户运行,跳过权限校验:
version: "3" services: web: stdin_open: true user: root # 新增该行 environment: - CHOKIDAR_USEPOLLING=true build: context: . dockerfile: Dockerfile.dev ports: - "4000:4000" volumes: - /app/node_modules - .:/app
生效步骤
修改配置后需要先清理旧的构建缓存和匿名卷,避免旧缓存残留导致配置不生效:
- 执行
docker-compose down -v停止容器并删除关联的匿名卷 - 执行
docker-compose up --build重新构建启动容器即可
内容的提问来源于stack exchange,提问作者FD3
相关产品推荐
相关产品推荐

