EACCES:尝试在节点项目中使用 docker 卷时,mkdir 权限被拒绝...

bat*_*tzu 6 node.js npm docker dockerfile

我试图使用 docker Volume 运行节点项目容器 -

\n
docker run -p 3000:3000 -v /myapp/node_modules -v $(pwd):/myapp batzu/frontend \n
Run Code Online (Sandbox Code Playgroud)\n

并得到一个错误 -

\n
EACCES: permission denied, mkdir '/myapp/node_modules/.cache'\n
Run Code Online (Sandbox Code Playgroud)\n

但是当我尝试在没有 -v 标志的情况下运行相同的容器时 -

\n
docker run -p 3000:3000 batzu/frontend\n
Run Code Online (Sandbox Code Playgroud)\n

容器启动正常,没有错误。

\n

第一个 docker 运行日志 -

\n
> frontend@0.1.0 start\n> react-scripts start\n\n\xe2\x84\xb9 \xef\xbd\xa2wds\xef\xbd\xa3: Project is running at http://172.17.0.2/\n\xe2\x84\xb9 \xef\xbd\xa2wds\xef\xbd\xa3: webpack output is served from \n\xe2\x84\xb9 \xef\xbd\xa2wds\xef\xbd\xa3: Content not from webpack is served from /myapp/public\n\xe2\x84\xb9 \xef\xbd\xa2wds\xef\xbd\xa3: 404s will fallback to /\nStarting the development server...\n\nFailed to compile.\n\nEACCES: permission denied, mkdir '/myapp/node_modules/.cache'\n
Run Code Online (Sandbox Code Playgroud)\n

使用的构建命令(该应用程序是一个示例react-app)-

\n
docker build -f Dockerfile.dev -t batzu/frontend .\n
Run Code Online (Sandbox Code Playgroud)\n

我的 Dockerfile.dev -

\n
FROM node:alpine\n\nWORKDIR /myapp\n\nCOPY package.json .\nRUN npm install\nCOPY . .\n\nCMD ["npm", "run", "start"]\n
Run Code Online (Sandbox Code Playgroud)\n

package.json由反应项目生成的文件-

\n
{\n  "name": "frontend",\n  "version": "0.1.0",\n  "private": true,\n  "dependencies": {\n    "@testing-library/jest-dom": "^5.11.9",\n    "@testing-library/react": "^11.2.5",\n    "@testing-library/user-event": "^12.7.1",\n    "react": "^17.0.1",\n    "react-dom": "^17.0.1",\n    "react-scripts": "4.0.2",\n    "web-vitals": "^1.1.0"\n  },\n  "scripts": {\n    "start": "react-scripts start",\n    "build": "react-scripts build",\n    "test": "react-scripts test",\n    "eject": "react-scripts eject"\n  },\n  "eslintConfig": {\n    "extends": [\n      "react-app",\n      "react-app/jest"\n    ]\n  },\n  "browserslist": {\n    "production": [\n      ">0.2%",\n      "not dead",\n      "not op_mini all"\n    ],\n    "development": [\n      "last 1 chrome version",\n      "last 1 firefox version",\n      "last 1 safari version"\n    ]\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我尝试sh进入容器并npm run start从中执行,但即使我能够在mkdir '/myapp/node_modules/.cache'没有任何权限错误的情况下从 shell 执行,也得到了相同的错误。 \n我无法理解-v /myapp/node_modulesdocker run 中的操作到底是做什么的在我们将工作目录映射到容器的 /myapp/ 目录之前,它应该为node_modules文件夹添加书签。为什么这会导致错误?

\n

有人可以指出我正确的方向或解释我做错了什么或解决办法......?

\n

提前谢谢了 :)

\n

bat*_*tzu 6

因此,通过环顾四周并查看其他人的 Dockerfile 以及在我的容器中的 bash 终端中运行的一些命令,我​​发现node:alpine我用作基础的映像node在容器内创建了一个名为的用户。

作为用户进程(带有 of 节点的进程)npm run start执行,该进程没有 root 权限(我在查看时发现),因此为了使用户成为 /app 目录的所有者,我在 docker 中添加了它文件-nodeUIDhtopnode

RUN chown -R node.node /app
Run Code Online (Sandbox Code Playgroud)

更新后的 Dockerfile.dev 是-

FROM node:alpine

WORKDIR '/app'

COPY package.json .
RUN npm install
RUN chown -R node.node /app

COPY . .

CMD ["npm", "run", "start"]
Run Code Online (Sandbox Code Playgroud)

这已经解决了我的问题,希望它也可以帮助其他人。:)


Iva*_*ruk 6

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
Run Code Online (Sandbox Code Playgroud)

请注意,如果您引入了内部包含测试覆盖服务的文件,它将与 CLI 一起使用dockerdocker-composedocker-compose.yml