Docker挂载主机目录到容器后文件消失的问题求助
解决思路
1. 排查composer install的执行逻辑
- 检查composer脚本是否包含删除主机目录文件的操作,比如清理缓存、批量删除文件的
rm -rf命令。因为挂载后容器内/opt/web-crm/public_html直接映射主机当前目录,容器内的任何删除/修改都会同步到主机。 - 查看
composer.json的scripts字段,确认有没有自定义的post-install钩子命令,这类命令可能在安装依赖时误删文件。 - 手动进入容器执行
composer install,实时观察主机目录的文件变化,定位具体是哪一步导致文件消失。
2. 验证Docker镜像的目录内容
- 先取消挂载配置,启动容器后查看
/opt/web-crm/public_html下的文件:docker exec web-app ls -la /opt/web-crm/public_html - 对比主机目录的内容,确认是否是挂载时主机目录覆盖了容器内原有文件(这种情况会让你误以为是文件消失)。
3. 排查Git仓库状态异常
- 执行
git status查看仓库状态,确认消失的文件是否是未提交的跟踪文件、或被.gitignore排除的文件。 - 检查是否有
git clean命令被误执行(可能在容器启动脚本或composer脚本中),该命令会删除未跟踪的文件,导致文件看起来“消失”。
4. 调整挂载方式降低风险
- 开发环境下避免直接挂载整个主机目录到容器应用根目录,改为挂载特定目录,比如:
volumes: - ./src:/opt/web-crm/public_html/src - ./composer.json:/opt/web-crm/public_html/composer.json - 或者先在Dockerfile中把代码复制到容器内,仅挂载需要热更新的目录(如
./public),避免容器内操作影响主机所有文件。
5. 检查挂载权限问题
- 查看容器内执行
composer install的用户:docker exec web-app whoami - 对比主机目录的用户权限:
ls -ld ./ - 如果权限不匹配,可能导致容器创建的文件主机无法读取(看起来像消失),可以在Dockerfile中添加
USER指令,指定和主机相同的UID/GID。
内容的提问来源于stack exchange,提问作者PawelC
相关产品推荐
相关产品推荐

