Dockerfile创建的目录容器运行后不可见,需实现主机容器文件同步
问题原因与解决方案:容器挂载本地目录后丢失镜像内创建的文件夹
问题根源
你在Dockerfile中通过RUN mkdir "test"创建的test目录,是存在于构建完成的镜像的/app路径下的。但docker-compose配置了volumes: - ./:/app,这会将主机当前目录直接挂载覆盖容器内的/app目录——因为主机本地目录里没有test文件夹,容器启动后/app下只会显示主机目录的内容,镜像中原有的test目录被挂载覆盖,自然无法看到。
针对你提到的Node.js场景,本质也是一样的:Dockerfile里通过RUN npm install安装到镜像node_modules的依赖,会被挂载的主机目录(无node_modules)覆盖,导致依赖丢失。
解决方案
方案1:主机提前创建目标文件夹
直接在主机当前目录执行命令创建需要的文件夹:
mkdir test
挂载后容器内/app/test会和主机的test同步,同时满足文件同步需求。
方案2:挂载子目录而非整个/app(推荐)
如果需要保留镜像内/app下的部分文件(比如Node.js的node_modules),可以只挂载需要同步的代码子目录,避免完全覆盖镜像目录。
修改docker-compose.yml:
version: '3' services: app: build: . volumes: - ./src:/app/src # 仅挂载需要同步的代码目录 command: tail -f /dev/null
对应的Dockerfile调整为:
FROM alpine WORKDIR /app COPY src /app/src RUN mkdir "test" RUN ls
方案3:单独保留镜像内的依赖目录(针对Node.js场景)
对于Node.js项目,可以通过匿名挂载单独保留镜像内的node_modules,避免被主机目录覆盖:
version: '3' services: app: build: . volumes: - ./:/app - /app/node_modules # 让容器使用镜像内的node_modules,不被主机覆盖 command: tail -f /dev/null
方案4:启动容器后手动创建(临时方案)
如果是临时需求,可进入容器后手动创建目录:
docker-compose exec app mkdir /app/test
该方式创建的目录会同步到主机目录,下次启动仍存在,但主机目录清空后需重新执行。
内容的提问来源于stack exchange,提问作者Mariusz
相关产品推荐
相关产品推荐

