(EACCES: permission denied, mkdir '/usr/app/node_modules/.cache)如何创建 docker-compose 文件以node_modules



我正在尝试将一个简单的create-react应用程序项目固定化。(是运行npx create-react-app test后的初始项目,没有更改任何文件)。

问题似乎是,在React的较新版本中,他们将烦人的.eslintcache从根文件夹移到了/node_modules/.cache,当容器试图通过docker-compose运行应用程序时会出现问题。

Dockerfile

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用户身份装载卷。

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

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

最终Dockerfile

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文件夹从本地目录复制到容器中。你可以安全地将其作为书签。

如果您有一个本地node_modules文件夹,请在运行docker或docker compose之前将其删除

因为可能还有另一种情况导致EACCES:权限被拒绝,mkdir'/usr/app/node_modules/.cache

这种情况可能是,您以前使用本地node_modules文件运行此react应用程序,然后删除该文件以使用容器node_module。

因此,在删除整个文件夹后,它仍然会重新创建文件夹,并在其中保留一个.cache文件,该文件通常不可见。

因此,当您使用"."为所有文件添加书签时:/usr/app";在docker-compose.yml或-v〃$(pwd):/usr/app";它试图为存储在localnode模块repo中的缓存文件添加书签,这引起了所有的麻烦。

这是由NPM更改其进程UID的长期问题引起的,该问题现已修复为NPM 9。

具体而言,它在NPM RFC评论中进行了描述:

Docker卷装载使用主机的UID:GID。这些变化npm已经有效地从UID:GID推断出执行用户中断docker设置,其中主机用户UID:GID与容器上的节点用户。在.env文件中为每个设置UID:GID我们的应用程序中的开发人员很麻烦,而且总体上很荒谬。在运行时不要试图推断最佳安全实践脚本,你的工作是成为一个包管理员

此修复程序在v9.0.0变更日志公告中被突出显示。

NPM跟踪器的相关变化:

  • https://github.com/npm/cli/blob/v9.1.2/CHANGELOG.md#900-2019年6月22日至10月19日
  • https://github.com/npm/rfcs/issues/546
  • https://github.com/npm/statusboard/issues/540
  • https://github.com/npm/cli/pull/5703
  • https://github.com/npm/cli/pull/5704

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

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"]

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

对于UBUNTU任何版本

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

示例

sudo chmod a+rwx Desktop/react-app/node_modules

解释

  • chmod-更改权限
  • a-全部
  • rwx-读取、写入和执行

要解决KUBERNETES中的问题,您必须使用路径目录/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

在DOCKER-COMPOSE文件中,删除试图排除node_modules的卷。它将工作

这清楚地表明,您无法访问docker容器中的节点模块。我尝试了很多,但下面给出的表格对我有效。

RUN mkdir-p/usr/src/app

RUN chmod+rwx/usr/src/app

WORKDIR/usr/src/app

首先通过上述命令授予READ WRITE EDIT权限对于您的工作目录文件,则它将正常工作。

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

Dockerfile

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'

将"用户节点"移高

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

在Linux中, 您必须为React应用程序授予读写权限

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

示例

sudo chmod a+rwx my-app/node_modules

快乐编码:)

在Mac中,您可以运行sudo chown-R$(whoami)路径

示例:sudo chown-R$(whoami)react survey app/nod_module/.cache/.slintcache

我也遇到了同样的问题。

问题是,我在/tmp中使用了vue create,然后将创建的文件夹的内容移动到我的卷中。

这显然是npm不太喜欢的。

所以我删除了node_modules,并用npm install重新创建了它,现在它就像一个符咒。

最新更新