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.jsonreact 项目生成的文件-


  "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 文件,它将同时与 dockerdocker-compose CLI 一起使用。

【讨论】:

以上是关于EACCES:权限被拒绝 mkdir ...尝试在节点项目中使用 docker 卷时的主要内容,如果未能解决你的问题,请参考以下文章

错误:EACCES:权限被拒绝,mkdir '/.npm'

电子制造商:EACCES:权限被拒绝

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 时