You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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运行容器

  1. 在Mac终端执行以下命令获取当前用户的UID和GID:
    id -u  # 获取UID,通常为501
    id -g  # 获取GID,通常为20
    
  2. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 06:17:29