使用Bind Mount与匿名卷时宿主生成node_modules的问题咨询
问题描述

使用Bind Mount或匿名卷时,node_modules文件夹会在宿主机器上生成,但node_modules不是应该在容器内创建吗?
当我执行以下命令时,node_modules文件夹会在我本地的项目目录中生成。
命令如下:
docker run -p 3000:80 -d --name feedback-app -v feedback:/app/feedback -v "/home/rohan/Documents/DockerTut/03 - Managing Data & Working with Volumes/003 data-volumes-01-starting-setup/data-volumes-01-starting-setup:/app:ro" -v /app/node_modules -v /app/temp feedback-node-app:volumes
问题解答
这种情况核心是你本地项目目录大概率提前通过npm install生成过node_modules,或者容器启动时的操作意外触发了本地目录的写入。
先拆解你这条命令的挂载逻辑:
-v "/xxx:/app:ro":把本地目录以只读模式挂载到容器的/app目录-v /app/node_modules:匿名卷,用来覆盖容器内/app/node_modules,避免被只读的bind mount覆盖-v /app/temp:匿名卷,同理保护/app/temp目录
正常情况下,匿名卷/app/node_modules会保留容器镜像里的node_modules内容,不会影响本地目录。但如果本地目录原本就有node_modules,只读挂载后容器里看到的就是本地的;如果本地原本没有,但你在容器里执行npm install,由于bind mount是只读的,操作会失败,除非你之前修改过挂载权限。
解决步骤:
- 删除本地项目目录里的node_modules,确保本地无该文件夹
- 重新执行你的docker命令,此时容器会用匿名卷保存镜像里的node_modules,不会在本地生成
- 检查Dockerfile里是否包含
npm install步骤,确保镜像构建时已安装好依赖,容器启动后无需再执行安装操作
内容的提问来源于stack exchange,提问作者Rohan Rana Magar
相关产品推荐
相关产品推荐

