【问题标题】:node in docker container is unable to use node_modules folderdocker 容器中的节点无法使用 node_modules 文件夹
【发布时间】:2021-06-16 06:54:53
【问题描述】:

我有一个这样的 dockerfile:

FROM node:alpine

WORKDIR /app

COPY package.json .

RUN npm install

VOLUME [ "/app/node_modules" ]

COPY . .

ENTRYPOINT [ "npm" ]
CMD [ "run", "dev" ]

我使用以下命令构建我的图像:

docker build -t my-vue-app .

然后我使用以下命令运行我的容器:

docker run -v $(pwd):/app --name app -it --rm my-vue-app

输出权限错误:

error when starting dev server:
Error: EACCES: permission denied, mkdir '/app/node_modules/.vite'
    at Object.mkdirSync (node:fs:1024:3)
    at optimizeDeps (/app/node_modules/vite/dist/node/chunks/dep-efe32886.js:65416:21)
    at runOptimize (/app/node_modules/vite/dist/node/chunks/dep-efe32886.js:69180:54)
    at Server.httpServer.listen (/app/node_modules/vite/dist/node/chunks/dep-efe32886.js:69194:23)
    at processTicksAndRejections (node:internal/process/task_queues:94:5)

我覆盖了我的入口点来访问我的容器的文件系统来检查权限。

docker run -v $(pwd):/app --name app -it --rm --entrypoint /bin/sh my-vue-app

/app # ls -l | grep node_modules

我可以看到node_modules 的所有者和组是root

输出:

drwxr-xr-x   52 root     root          4096 Mar 18 20:04 node_modules

所有其他文件都有所有者和组node

/app # ls -l
total 28
-rw-rw-r--    1 node     node           154 Mar 18 20:02 Dockerfile
-rw-r--r--    1 node     node           337 Mar 18 19:26 index.html
drwxr-xr-x   52 root     root          4096 Mar 18 20:04 node_modules
-rw-r--r--    1 node     node           307 Mar 18 19:26 package.json
drwxr-xr-x    2 node     node          4096 Mar 18 19:26 public
drwxr-xr-x    4 node     node          4096 Mar 18 19:26 src
-rw-r--r--    1 node     node           156 Mar 18 19:26 vite.config.js

所以,我想知道为什么会发生这种情况,我能做些什么来解决它?还有一件事是,当我使用node:lts 而不是node:alpine 时,node_modules 的用户和组仍然是root,但它工作正常。

目前node:ltsnode:14.16.0

【问题讨论】:

    标签: linux bash docker dockerfile file-permissions


    【解决方案1】:

    您应该在整个设置中删除所有提及任何类型的卷。不要为node_modules 目录声明VOLUME;不要使用docker run -v 选项替换图像的代码。

    完成此操作后,图像将是独立的。如果您愿意,您可以将其推送到注册表,并将其docker run 推送到另一个系统上,而无需单独下载代码。绑定挂载可能会导致主机用户 ID 和构建时用户 ID 混淆,这可能是您的设置中发生的情况。 VOLUME 还会导致 Docker 泄漏匿名卷,并且在基于 Compose 的设置中可能会导致您的 package.json 文件中的任何更改被忽略。

    这种方法不支持在容器内实时重新加载,但在主机上安装 Node 非常容易(您可能已经拥有它),并且基于主机的 Node 将与 IDE 和其他工具一起工作得更好。

    (我还将ENTRYPOINTCMD 组合成一个CMD。如果不出意外,这将通过不需要docker run --entrypoint 选项来简化“运行调试shell”的情况;您可以@ 987654331@.)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      相关资源
      最近更新 更多