Docker - EACCES:权限被拒绝,mkdir '/app/node_modules/.cache'

12
我今天刚开始使用docker,但由于权限问题而遇到了阻碍。我不知道应该输入什么来切换权限,我认为这可能与chown有关。虽然stackoverflow上有其他的问题,但它们要么不是特定于Docker的,要么没有选定答案来回答这个问题。
下面是错误信息:
client_1  | 
client_1  | > client@0.1.0 start
client_1  | > react-scripts start
client_1  | 
client_1  | ℹ 「wds」: Project is running at http://172.19.0.2/
client_1  | ℹ 「wds」: webpack output is served from 
client_1  | ℹ 「wds」: Content not from webpack is served from /app/public
client_1  | ℹ 「wds」: 404s will fallback to /
client_1  | Starting the development server...
client_1  | 
client_1  | Failed to compile.
client_1  | 
client_1  | EACCES: permission denied, mkdir '/app/node_modules/.cache'

我的docker-compose.yml文件如下:

version: "3"
services:
  client:
    stdin_open: true
    build:
      context: .
      dockerfile: Dockerfile.dev
    ports:
      - "3000:3000"
    volumes:
      - "/app/node_modules"
      - "./:/app"

我的 Dockerfile.dev 看起来像这样:
FROM node:alpine
RUN apk update && apk add git && apk add python make g++

WORKDIR /app

COPY package.json /app

# To Fix Permissions for Packages
RUN npm config set unsafe-perm true

RUN npm install --force

COPY . /app

CMD ["npm", "run", "start"]
5个回答

7

我曾经遇到过类似的问题。我的理解是,当应用程序运行时,它不是以root身份运行的,因此当它尝试创建.cache目录时,它没有足够的凭据来完成此操作。我使用了非常相似的镜像(node:lts-alpine),它已经带有一个名为node的用户。我所做的事情是在正确的位置上创建一个名为.cache的文件夹,并更改其所有权以使node能够访问它,并以node身份运行应用程序。实际上,我将应用程序作为node运行,因为我要部署到Heroku,那里的容器不会以root身份运行。在你的情况下,需要这样做:

FROM node:alpine
RUN apk update && apk add git && apk add python make g++

WORKDIR /app

COPY package.json /app

# To Fix Permissions for Packages
RUN npm config set unsafe-perm true

RUN npm install --force

COPY . /app

RUN chown -R node /app/node_modules

USER node

CMD ["npm", "run", "start"]

谢谢你的尝试,Andre,但我仍然遇到了相同的错误 :( 我执行了以下命令... sudo docker-compose build --no-cache,然后是sudo docker-compose up。 - Michael Paccione
尝试使用 RUN chown -R node /app/node_modules 替代。这可能需要更长的时间,但不会太多。然后您可以删除 RUN mkdir -p /app/node_modules/.cache 这行。 - André Guimarães Aragon
1
尝试添加以下内容: RUN chown -R node:node /app/node_modules 而不是 RUN chown -R node /app/node_modulesRUN chmod -R 744 /app/node_modules 如果这样做不起作用,那么您的容器可能没有以用户“node”运行。在这种情况下,您可以尝试 RUN chmod -R 777 /app/node_modules 仅供您的容器启动,然后尝试找出正在使用哪个用户来运行容器,然后给予该用户写入和执行权限。让我知道这是否有效! - André Guimarães Aragon
3
我意识到这会影响那些没有设置非sudo docker的Ubuntu用户。如果在npm install之前运行RUN mkdir -p /app/node_modules,然后再运行RUN chown node:node /app/node_modules,那么它的效果同样好,但速度更快。 - thadk
是的,这样做速度快多了。 - NickC

4

我遇到了同样的错误,使用以下 Docker 文件解决了它。

RUN npm config set unsafe-perm true

RUN npm install --force

COPY ./ /usr/app/

RUN chown -R node /usr/app/node_modules

USER node

0

以防其他人搜索相同错误但使用类似的Dockerfile,特此说明。

请检查Dockerfile是否将node_modules安装在应用程序目录而不是父目录中:

RUN npm install --production --silent
# RUN npm install --production --silent && mv node_modules ../

这是与VScode Docker扩展相关的常见问题,如此问题所示。

https://github.com/microsoft/vscode-docker/issues/2071

将软件安装在父文件夹中有优点,但是可能父文件夹的权限设置不正确。


0

docker-compose.yaml中添加CHOKDIR_USERPOOLING=true对我有用。

environment:
    - CHOKDIR_USERPOOLING=true

1
你是指 CHOKIDAR_USEPOLLING 吗? - Stefan_EOX

0

有相同的问题,我在WSL2中使用Docker桌面版。

我尝试了npm的不安全perm选项,但没用。

然后我从Windows中删除了node_modules文件夹,然后从容器内部执行了npm i。甚至不需要强制npm安装。

那样就可以了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接