Docker卷挂载后本地生成空node_modules文件夹问题求助
Docker卷挂载问题:本地自动生成空node_modules文件夹
终端操作记录
root@iZ2zee46sbqa371vzyq1jpZ:~/docker_learning/volumes_learning/data-volumes-02-added-dockerfile# cat Dockerfile FROM node:14 WORKDIR /app COPY package.json . RUN npm install COPY . . EXPOSE 80 CMD ["npm", "start"] root@iZ2zee46sbqa371vzyq1jpZ:~/docker_learning/volumes_learning/data-volumes-02-added-dockerfile# docker build -t feedbackimg . [+] Building 0.3s (10/10) FINISHED docker:default => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 145B 0.0s => [internal] load metadata for docker.io/library/node:14 0.0s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [1/5] FROM docker.io/library/node:14 0.0s => [internal] load build context 0.0s => => transferring context: 369B 0.0s => CACHED [2/5] WORKDIR /app 0.0s => CACHED [3/5] COPY package.json . 0.0s => CACHED [4/5] RUN npm install 0.0s => [5/5] COPY . . 0.0s => exporting to image 0.1s => => exporting layers 0.0s => => writing image sha256:c6c67ae9a59c9d34ce2d59216eae2e6df2fe0c67366319d4e3095bd60bfe66b9 0.0s => => naming to docker.io/library/feedbackimg 0.0s root@iZ2zee46sbqa371vzyq1jpZ:~/docker_learning/volumes_learning/data-volumes-02-added-dockerfile# ls Dockerfile feedback node_modules package.json pages public server.js temp root@iZ2zee46sbqa371vzyq1jpZ:~/docker_learning/volumes_learning/data-volumes-02-added-dockerfile# rm -r node_modules/ root@iZ2zee46sbqa371vzyq1jpZ:~/docker_learning/volumes_learning/data-volumes-02-added-dockerfile# ls Dockerfile feedback package.json pages public server.js temp root@iZ2zee46sbqa371vzyq1jpZ:~/docker_learning/volumes_learning/data-volumes-02-added-dockerfile# docker run -p 8000:80 -d --rm --name feedback-app -v feedback:/app/feedback -v "/root/docker_learning/volumes_learning/data-volumes-02-added-dockerfile:/app" -v /app/node_modules feedbackimg d0f9829868ad5e39a780afd13dc00f8e89848a8323a396fe19fa9d1b14f25ef0 root@iZ2zee46sbqa371vzyq1jpZ:~/docker_learning/volumes_learning/data-volumes-02-added-dockerfile# ls Dockerfile feedback node_modules package.json pages public server.js temp
问题描述
执行上述docker run命令后,本地目录自动生成了空的node_modules文件夹,与预期不符。
个人理解
- 卷按「路径长度」优先级管理;
- 指向
/app的绑定挂载路径最短,优先级最低,/app/feedback和/app/node_modules卷优先级更高; - Dockerfile生成的容器内
node_modules不会通过绑定挂载映射到本地。
操作目的
- 空
feedback目录的内容需保存到卷中,不被绑定挂载覆盖; - 本地无
node_modules,依赖容器内npm install生成的对应目录。
问题原因与解决方案
核心问题
- 匿名卷不会复制镜像内容:你用了匿名卷
-v /app/node_modules,Docker仅会对命名卷在首次挂载时自动复制镜像对应路径的内容,匿名卷不会,所以这个卷是空的。 - 绑定挂载双向同步:容器内
/app绑定挂载到本地目录,空的匿名卷/app/node_modules会通过双向同步在本地生成空文件夹。 - 挂载优先级理解错误:Docker卷的优先级是后挂载的覆盖先挂载的,而非路径长度,不过这不是本次问题的核心。
解决方案
将/app/node_modules改为命名卷,确保首次启动时镜像内的依赖目录被复制到卷中,同时避免本地同步空文件夹。修改后的docker run命令如下:
docker run -p 8000:80 -d --rm --name feedback-app \ -v feedback:/app/feedback \ -v node_modules:/app/node_modules \ -v "/root/docker_learning/volumes_learning/data-volumes-02-added-dockerfile:/app" \ feedbackimg
验证步骤
- 删除本地已生成的空
node_modules文件夹; - 执行上述修改后的启动命令;
- 查看本地目录,不会再生成
node_modules; - 进入容器执行
ls /app/node_modules,能看到完整的依赖文件; - 提交反馈后,内容会保存到命名卷
feedback中,不会被绑定挂载覆盖。
内容的提问来源于stack exchange,提问作者夏浅沫
相关产品推荐
相关产品推荐

