bat*_*tzu 6 node.js npm docker dockerfile
我试图使用 docker Volume 运行节点项目容器 -
\ndocker run -p 3000:3000 -v /myapp/node_modules -v $(pwd):/myapp batzu/frontend \n
Run Code Online (Sandbox Code Playgroud)\n并得到一个错误 -
\nEACCES: permission denied, mkdir '/myapp/node_modules/.cache'\n
Run Code Online (Sandbox Code Playgroud)\n但是当我尝试在没有 -v 标志的情况下运行相同的容器时 -
\ndocker 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)-
\ndocker build -f Dockerfile.dev -t batzu/frontend .\n
Run Code Online (Sandbox Code Playgroud)\n我的 Dockerfile.dev -
\nFROM 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)\npackage.json
由反应项目生成的文件-
{\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_modules
docker run 中的操作到底是做什么的在我们将工作目录映射到容器的 /myapp/ 目录之前,它应该为node_modules
文件夹添加书签。为什么这会导致错误?
有人可以指出我正确的方向或解释我做错了什么或解决办法......?
\n提前谢谢了 :)
\n因此,通过环顾四周并查看其他人的 Dockerfile 以及在我的容器中的 bash 终端中运行的一些命令,我发现node:alpine
我用作基础的映像node
在容器内创建了一个名为的用户。
作为用户进程(带有 of 节点的进程)npm run start
执行,该进程没有 root 权限(我在查看时发现),因此为了使用户成为 /app 目录的所有者,我在 docker 中添加了它文件-node
UID
htop
node
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)
这已经解决了我的问题,希望它也可以帮助其他人。:)
您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 一起使用docker
。docker-compose
docker-compose.yml
归档时间: |
|
查看次数: |
16270 次 |
最近记录: |