如何解决Docker中的EPERM权限错误(MacBook Pro M1环境)
解决Docker中EPERM权限错误问题
问题描述
在MacBook Pro M1设备上使用Docker 4.21.1时,遇到以下权限错误:
[Error: EPERM: operation not permitted, open '/usr/app/src/server.js'] { errno: -1, code: 'EPERM', syscall: 'open', path: '/usr/app/src/server.js' }
相关配置文件
Dockerfile
FROM node:20-alpine3.17 as deps_installer RUN mkdir -p /usr/app WORKDIR /usr/app COPY package*.json ./ RUN npm install FROM node:20-alpine3.17 as deployment WORKDIR /usr/app COPY --chown=node:node --from=deps_installer /usr/app/node_modules ./node_modules COPY --chown=node:node ./src ./src COPY --chown=node:node package.json . COPY --chown=node:node nodemon.json . USER node CMD [ "npm","run","dev" ]
docker-compose.yml
version: "3" volumes: pg_data: networks: arg-network: services: express-server: container_name: node-server image: arg-express-server build: context: ./ dockerfile: Dockerfile target: deployment networks: - arg-network volumes: - ./src:/usr/app/src ports: - 80:8000 env_file: - .env postgres-server: container_name: postgres-db image: postgres:15.5-alpine3.19 networks: - arg-network volumes: - pg_data:/var/lib/postgresql environment: - POSTGRES_USER=arg-user - POSTGRES_PASSWORD=$#$SDFS^&%^343 - POSTGRES_DB=arg ports: - 5432:5432
问题原因
挂载本地./src目录到容器/usr/app/src后,容器内该目录的权限继承自本地文件系统。容器中运行的node用户(默认UID为1000)没有本地文件的读写权限,导致无法打开server.js文件,触发EPERM错误。
解决方案
方案1:匹配本地用户UID/GID运行容器
- 在Mac终端执行以下命令获取当前用户的UID和GID:
id -u # 获取UID,通常为501 id -g # 获取GID,通常为20 - 修改
docker-compose.yml中express-server服务的配置,添加user字段:services: express-server: # ...其他配置 user: "501:20" # 替换为你获取到的UID和GID
方案2:在Dockerfile中指定匹配本地的用户UID/GID
修改Dockerfile的deployment阶段,创建node用户时指定与本地一致的UID和GID:
FROM node:20-alpine3.17 as deployment # 替换为你本地的GID和UID RUN addgroup -g 20 -S nodegroup && adduser -u 501 -S node -G nodegroup WORKDIR /usr/app COPY --chown=node:node --from=deps_installer /usr/app/node_modules ./node_modules COPY --chown=node:node ./src ./src COPY --chown=node:node package.json . COPY --chown=node:node nodemon.json . USER node CMD [ "npm","run","dev" ]
方案3:临时调试——启动时修改目录权限
如果仅需临时调试,可在docker-compose.yml中修改启动命令,先调整目录权限再启动服务(不推荐长期使用):
services: express-server: # ...其他配置 command: sh -c "chown -R node:node /usr/app/src && npm run dev"
内容的提问来源于stack exchange,提问作者Santosh Poudel
相关产品推荐
相关产品推荐

