EACCES:权限被拒绝 mkdir ...尝试在节点项目中使用 docker 卷时
Posted
技术标签:
【中文标题】EACCES:权限被拒绝 mkdir ...尝试在节点项目中使用 docker 卷时【英文标题】:EACCES: permission denied mkdir ... while trying to use docker volumes in a node project 【发布时间】:2021-05-24 15:09:09 【问题描述】:我试图使用 docker 卷运行节点项目容器 -
docker run -p 3000:3000 -v /myapp/node_modules -v $(pwd):/myapp batzu/frontend
得到一个错误 -
EACCES: permission denied, mkdir '/myapp/node_modules/.cache'
但是当我尝试在没有 -v 标志的情况下运行同一个容器时 -
docker run -p 3000:3000 batzu/frontend
容器启动正常,没有错误。
第一个 docker 运行日志-
> frontend@0.1.0 start
> react-scripts start
ℹ 「wds」: Project is running at http://172.17.0.2/
ℹ 「wds」: webpack output is served from
ℹ 「wds」: Content not from webpack is served from /myapp/public
ℹ 「wds」: 404s will fallback to /
Starting the development server...
Failed to compile.
EACCES: permission denied, mkdir '/myapp/node_modules/.cache'
使用的构建命令(应用程序是一个示例 react-app)-
docker build -f Dockerfile.dev -t batzu/frontend .
我的 Dockerfile.dev -
FROM node:alpine
WORKDIR /myapp
COPY package.json .
RUN npm install
COPY . .
CMD ["npm", "run", "start"]
package.json
react 项目生成的文件-
"name": "frontend",
"version": "0.1.0",
"private": true,
"dependencies":
"@testing-library/jest-dom": "^5.11.9",
"@testing-library/react": "^11.2.5",
"@testing-library/user-event": "^12.7.1",
"react": "^17.0.1",
"react-dom": "^17.0.1",
"react-scripts": "4.0.2",
"web-vitals": "^1.1.0"
,
"scripts":
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject"
,
"eslintConfig":
"extends": [
"react-app",
"react-app/jest"
]
,
"browserslist":
"production": [
">0.2%",
"not dead",
"not op_mini all"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
我尝试将sh
放入容器并从中执行npm run start
,但即使我能够在没有任何权限错误的情况下从shell 执行mkdir '/myapp/node_modules/.cache'
,也会遇到同样的错误。
我无法理解 docker run 中的 -v /myapp/node_modules
究竟做了什么,正如我被告知的那样,在我们将工作目录映射到容器的 /myapp/ 目录之前,它应该为 node_modules
文件夹添加书签。为什么会导致错误??
谁能指出我正确的方向或解释我做错了什么或修复......?
提前非常感谢:)
【问题讨论】:
这能回答你的问题吗? Permission denied on accessing host directory in Docker 问题是我可以毫无问题地运行 node_modules 文件夹中的任何命令,它只是 npm run start 会引发错误..npm run start
做什么?使用package.json
脚本部分更新问题
我已经更新了包含package.json
文件的问题。
尽量不要使用$cwd
值,而是使用常规文件夹,即。 /foo/bar
.
【参考方案1】:
所以,我通过环顾四周并看到其他人的 Dockerfile 以及在我的容器中的 bash 终端中运行的一些命令收集到的是,我用作基础的 node:alpine
图像在内部创建了一个名为 node
的用户容器。
npm run start
是作为node
用户的进程执行的(使用节点的UID
的进程),它没有root 权限(我在查看htop
时发现),所以按顺序为了使 node
用户成为 /app 目录的所有者,我在 docker 文件中添加了这个-
RUN chown -R node.node /app
更新后的 Dockerfile.dev 是-
FROM node:alpine
WORKDIR '/app'
COPY package.json .
RUN npm install
RUN chown -R node.node /app
COPY . .
CMD ["npm", "run", "start"]
这已经解决了我的问题,希望它也可以帮助其他人。 :)
【讨论】:
【参考方案2】:在 Dockerfile.dev 中添加一行
RUN chmod 777 node_modules
现在 Dockerfile.dev 是这样的:-
FROM node:alpine
WORKDIR '/app'
COPY package.json .
RUN npm install
COPY . .
RUN chmod 777 node_modules
CMD ["npm","run","start"]
【讨论】:
【参考方案3】:您的Dockerfile.dev
应如下所示,注意COPY
将代表node
用户执行,WORKDIR
应为/home/node
(有关更多信息,请查看https://github.com/nodejs/docker-node/issues/740#issuecomment-458545074 ):
FROM node:alpine
WORKDIR /home/node/app
RUN chown -R node:node /home/node/app
COPY --chown=node:node package.json .
RUN npm install
COPY --chown=node:node . .
# At the end, set the user to use when running this image
USER node
CMD npm run start
请注意,如果您曾在内部引入带有测试覆盖服务的 docker-compose.yml
文件,它将同时与 docker
和 docker-compose
CLI 一起使用。
【讨论】:
以上是关于EACCES:权限被拒绝 mkdir ...尝试在节点项目中使用 docker 卷时的主要内容,如果未能解决你的问题,请参考以下文章
Errno::EACCES(权限被拒绝@dir_s_mkdir
将 React 添加到工作区失败,EACCES:权限被拒绝,mkdir '/home/mint/.cache/Cypress'
Rails 4.2.0 - Errno::EACCES(权限被拒绝@dir_s_mkdir - /files)
EACCES:权限被拒绝,mkdir '/node_modules/node-sass/build' 在 ubuntu 上运行 npm install 时