(EACCES: permission denied, mkdir '/usr/app/node_modules/.cache) 如何创建 docker-compose 文件使 node_modules 成为非根文件夹?
(EACCES: permission denied, mkdir '/usr/app/node_modules/.cache) How can I create a docker-compose file to make node_modules a non-root folder?
我正在尝试 docker 化一个简单的 create-react-app 项目。 (是运行宁npx create-react-app test
后的初始项目,没有改动文件)。
问题似乎是在较新版本的 React 中,他们将烦人的 .eslintcache
从根文件夹移至 /node_modules/.cache
,导致容器试图 运行 通过 docker-compose
.
申请
Docker 文件
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"]
docker-撰写
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_modules
归 node
用户所有的情况下,是否有任何解决方法?
更新
显然,这是因为我正在使用 Ubuntu 并且 docker 在 Linux 系统上以 root 身份安装卷。
我提出的解决方案是在本地安装 node_modues
然后修改 Dockerfile
将所有内容复制到容器中并将其用作卷而不是安装和添加书签 node_modules
在构建过程中。我知道这不是解决这个问题的最佳方法,但对于我几天来一直在努力解决的问题来说,这是一个简单的解决方案。
Docker 文件
FROM node:alpine
WORKDIR /usr/app
COPY . ./
CMD ["npm", "start"]
docker-撰写
version: '3'
services:
test:
stdin_open: true
build:
context: .
dockerfile: Dockerfile.dev
environment:
- CHOKIDAR_USEPOLLING=true
volumes:
- .:/usr/app
ports:
- '3000:3000'
在您的 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
文件夹从您的本地目录复制到容器中。您可以放心地为它添加书签。
我刚刚偶然发现了同样的问题。如果您想知道我是如何处理它的,我只是在最后一行之前添加了两行。它就像一个魅力。
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"]
如果您有本地 node_modules 文件夹,请在 运行ning docker 或 docker-compose[= 之前将其删除10=]
因为可能还有其他情况导致
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 模块 repo 中的缓存文件添加书签并导致所有的麻烦。
我正在尝试 docker 化一个简单的 create-react-app 项目。 (是运行宁npx create-react-app test
后的初始项目,没有改动文件)。
问题似乎是在较新版本的 React 中,他们将烦人的 .eslintcache
从根文件夹移至 /node_modules/.cache
,导致容器试图 运行 通过 docker-compose
.
Docker 文件
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"]
docker-撰写
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_modules
归 node
用户所有的情况下,是否有任何解决方法?
更新
显然,这是因为我正在使用 Ubuntu 并且 docker 在 Linux 系统上以 root 身份安装卷。
我提出的解决方案是在本地安装 node_modues
然后修改 Dockerfile
将所有内容复制到容器中并将其用作卷而不是安装和添加书签 node_modules
在构建过程中。我知道这不是解决这个问题的最佳方法,但对于我几天来一直在努力解决的问题来说,这是一个简单的解决方案。
Docker 文件
FROM node:alpine
WORKDIR /usr/app
COPY . ./
CMD ["npm", "start"]
docker-撰写
version: '3'
services:
test:
stdin_open: true
build:
context: .
dockerfile: Dockerfile.dev
environment:
- CHOKIDAR_USEPOLLING=true
volumes:
- .:/usr/app
ports:
- '3000:3000'
在您的 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
文件夹从您的本地目录复制到容器中。您可以放心地为它添加书签。
我刚刚偶然发现了同样的问题。如果您想知道我是如何处理它的,我只是在最后一行之前添加了两行。它就像一个魅力。
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"]
如果您有本地 node_modules 文件夹,请在 运行ning docker 或 docker-compose[= 之前将其删除10=]
因为可能还有其他情况导致 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 模块 repo 中的缓存文件添加书签并导致所有的麻烦。