Docker单文件挂载到容器目录时原有文件消失如何解决?
问题原因
你遇到的目录原有文件消失的问题,绝大多数是启动容器时宿主机上的./pages/page5.php、./pages/page6.php不存在,Docker自动将这两个挂载源创建为了目录,叠加旧的残留卷挂载规则导致整个目录被覆盖。
以下是三种可行的解决方案:
方案1:单文件绑定挂载(无需修改配置,优先尝试)
单个文件的绑定挂载本身不会覆盖目录内的其他原有文件,你可以按以下步骤清理后重试:
- 提前在宿主机创建好对应文件,删除之前Docker自动生成的同名空目录:
rm -rf ./pages/page5.php ./pages/page6.php touch ./pages/page5.php ./pages/page6.php
- 清理旧容器和关联残留卷,重新启动:
docker-compose down -v docker-compose up -d
方案2:命名卷叠加单文件挂载(适合频繁修改宿主机文件的场景)
如果你需要经常修改page5、page6的内容,又想保留容器内原有文件,可以用命名卷存储原有目录内容,再叠加单文件挂载,配置如下:
# 提前声明命名卷,会自动同步镜像内/var/www/html/pages目录的原有内容 volumes: pages-data: services: server: image: myapp volumes: - pages-data:/var/www/html/pages # 单文件挂载优先级高于命名卷,只会覆盖对应文件,不影响其他原有文件 - ./pages/page5.php:/var/www/html/pages/page5.php - ./pages/page6.php:/var/www/html/pages/page6.php
方案3:自定义镜像打包(适合固定新增文件的场景)
如果page5、page6是固定要加入容器、不需要频繁修改的文件,可以直接构建自定义镜像,无需挂载:
- 编写Dockerfile:
FROM myapp COPY ./pages/page5.php /var/www/html/pages/ COPY ./pages/page6.php /var/www/html/pages/
- 修改docker-compose.yml配置:
server: build: .
- 启动容器即可:
docker-compose up -d --build
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

