npm (EACCES:权限被拒绝,mkdir '/usr/app/node_modules/.cache)我如何创建一个停靠合成文件来使node_modules成为一个非根文件夹?

w6mmgewl  于 2022-11-14  发布在  其他
关注(0)|答案(8)|浏览(228)

我正在尝试停靠一个简单的create-react-app项目。(是运行npx create-react-app test后的初始项目,没有更改任何文件)。
问题似乎是在React的较新版本中,他们将恼人的.eslintcache从根文件夹移动到/node_modules/.cache,当容器试图通过docker-compose运行应用程序时,会导致问题。

停靠文件

FROM node:alpine

WORKDIR /usr/app

COPY package*.json ./

RUN npm install

RUN chown -R node.node /usr/app/node_modules

COPY . ./

CMD ["npm", "start"]

停靠合成

version: '3'
services: 
  test:
    stdin_open: true
    build:
      context: .
      dockerfile: Dockerfile
    environment:
      - CHOKIDAR_USEPOLLING=true
    volumes:
      - /usr/app/node_modules
      - .:/usr/app
    ports:
      - '3000:3000'

容器正在记录此错误消息:

test_1   | Failed to compile.
test_1   | 
test_1   | EACCES: permission denied, mkdir '/usr/app/node_modules/.cache

正如您所注意到的,我试图将node_modules文件夹所有者设置为节点用户(node:alpine的默认用户),但是没有成功;浏览该容器,您可以看到node_modules文件夹仍然归root所有:

drwxrwxr-x    5 node     node          4096 Apr 14 07:04 .
drwxr-xr-x    1 root     root          4096 Apr 14 07:08 ..
-rw-rw-r--    1 node     node           310 Apr 14 06:56 .gitignore
-rw-rw-r--    1 node     node           192 Apr 14 07:30 Dockerfile
-rw-rw-r--    1 node     node          3369 Apr 14 06:56 README.md
drwxrwxr-x 1061 root     root         36864 Apr 14 07:12 node_modules
-rw-rw-r--    1 node     node        692936 Apr 14 06:56 package-lock.json
-rw-rw-r--    1 node     node           808 Apr 14 06:56 package.json
drwxrwxr-x    2 node     node          4096 Apr 14 06:56 public
drwxrwxr-x    2 node     node          4096 Apr 14 06:56 src

我还尝试创建RUN mkdir -p /usr/app文件夹并使用USER node,但最终出现了npm无法创建node_modules文件夹的问题。
如果.eslintcache被禁用或node_modulesnode用户所有,是否有解决方法?

更新

显然,这是因为我使用Ubuntu和Docker在Linux系统上以root身份装载卷。

llew8vvj

llew8vvj1#

在Dockerfile中的RUN npm install后面添加以下行可以解决此问题:

RUN mkdir -p node_modules/.cache && chmod -R 777 node_modules/.cache

最终停靠文件

FROM node:alpine

WORKDIR /usr/app

COPY package.json .
RUN npm install

RUN mkdir node_modules/.cache && chmod -R 777 node_modules/.cache

COPY . .

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

这样就不需要将node_modules文件夹从本地目录复制到容器中,您可以安全地将其添加为书签。

vfwfrxfs

vfwfrxfs2#

如果您有本机node_modules文件夹,请在执行docker或docker-compose之前删除它

因为可能存在另一种导致EACCES的情况:权限被拒绝,mkdir '/usr/app/node_modules/.cache
这可能是您之前使用本地node_modules文件运行此react-app,然后删除该文件以使用容器node_module的情况。
因此,在删除整个文件夹后,它仍然会重新创建该文件夹,并在其中保留一个.cache文件,该文件通常是不可见的。
因此,当你在docker-compose.yml中使用′.:/usr/app ′或-v“$(pwd):/usr/app”为所有文件添加书签时,它会试图为存储在local_node模块存储库中缓存文件添加书签,这会引起所有的麻烦。

n53p2ov0

n53p2ov03#

我刚刚偶然发现了同样的问题。如果你想知道我是如何处理它的,我只是在最后一行之前加了两行。它就像一个魅力。

FROM node:16.13.0-alpine

WORKDIR /app

COPY package.json ./
COPY package-lock.json ./

RUN npm config set unsafe-perm true
RUN npm install --silent

COPY . .

RUN chown -R node /app/node_modules

USER node

CMD ["npm", "start"]
jjhzyzn0

jjhzyzn04#

我提出的解决方案是在本地安装node_modues,然后修改Dockerfile,将所有内容复制到容器中,并将其用作卷,而不是在构建过程中安装和标记node_modules。我知道这不是解决这个问题的最佳方法,但对于我已经尝试解决了几天的问题来说,这是一个简单的解决方案。

停靠文件

FROM node:alpine

WORKDIR /usr/app

COPY . ./

CMD ["npm", "start"]

停靠合成

version: '3'
services: 
  test:
    stdin_open: true
    build:
      context: .
      dockerfile: Dockerfile.dev
    environment:
      - CHOKIDAR_USEPOLLING=true
    volumes:
      - .:/usr/app
    ports:
      - '3000:3000'
fdbelqdn

fdbelqdn5#

我也有同样的问题。
问题是,我在/tmp中使用了vue create,然后将创建的文件夹的内容移到了我的卷中。
显然npm不太喜欢。
所以我删除了node_modules,并使用npm install重新创建了它,现在它的工作就像一个魅力。

x6yk4ghg

x6yk4ghg6#

很明显,您在节点模块文件夹中没有读、写和执行权限,您可能会看到节点模块文件夹上出现一个锁图标。

适用于任何版本的UBUNTU

sudo chmod a+rwx <path>/your-project-folder/node_modules

示例

sudo chmod a+rwx Desktop/react-app/node_modules
  • 说明 *
  • chmod -更改权限
  • a -全部
  • rwx -读取、写入和执行
p1tboqfb

p1tboqfb7#

要在KUBERNETES中修复此问题,您必须挂载一个空的dir卷,路径目录为/app/.next/cache

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deploy
spec:
  template:
    metadata:
      labels:
        type: my-label
    spec:
      containers:
        image: ghcr.io/myimage
        imagePullPolicy: Always
        name: my-site
        ports:
        - containerPort: 3000
          name: http
          protocol: TCP
        volumeMounts:
        - mountPath: /app/.next/cache
          name: cache
      volumes:
      - emptyDir: {}
        name: cache
k2arahey

k2arahey8#

将“用户节点”上移

我只使用了Docker(没有Docker-compose),解决方案是将USER node移到COPY package*...之前

相关问题