Docker挂载卷常见问题排查:为什么挂载后容器内是空的?
本文记录了一个典型的Docker挂载问题排查过程涉及Docker卷挂载原理、权限问题、路径正确性验证等关键知识点。如果你也遇到过挂载后容器内目录为空的问题这篇排查指南能帮你快速定位问题。问题背景我在使用OnlyOffice DocumentServer镜像时遇到了一个奇怪的问题用同一个镜像启动了两个容器一个挂载了web-apps目录到宿主机一个没挂载没挂载的容器内web-apps下有完整内容挂载的容器内web-apps目录显示为空宿主机挂载点目录也显示为空启动命令如下docker run -itd \ --name ds-china \ -p 9000:80 \ -p 9090:8000 \ --restartalways \ --privileged \ -e ALLOW_PRIVATE_IP_ADDRESStrue \ -e JWT_ENABLEDfalse \ -v /home/yxc/data/onlyoffice/Data:/var/www/onlyoffice/Data \ -v /home/yxc/data/onlyoffice/App_Data:/var/www/onlyoffice/App_Data \ -v /home/yxc/data/onlyoffice/cpuinfo:/host/proc/cpuinfo \ -v /home/yxc/data/onlyoffice/class:/host/sys/class \ -v /home/yxc/data/onlyoffice/web-apps:/var/www/onlyoffice/documentserver/web-apps \ docker.1ms.run/moqisoft/documentserver:9.3.1问题排查过程第一阶段理解Docker挂载原理关键发现Docker的-v挂载是覆盖行为当使用-v 宿主机路径:容器内路径时如果宿主机路径存在且有内容 → 容器内看到宿主机的内容如果宿主机路径存在但为空 → 容器内看到空目录如果宿主机路径不存在 → Docker创建空目录然后容器内看到空目录重要结论挂载发生在容器启动时事后用docker cp复制文件到容器不会出现在挂载点。第二阶段权限问题排查检查权限时发现# 宿主机目录权限 ls -ld /home/yxc/data/onlyoffice/web-apps/ # 输出drwxr-xr-x 4 yxc yxc 4096 Jun 27 2025 /home/yxc/data/onlyoffice/web-apps/ # 容器内用户 docker exec ds-china id # 输出uid0(root) gid0(root) groups0(root)容器以root用户运行但宿主机目录属于yxc:yxc。这实际上不是问题因为root用户可以访问任何文件。第三阶段路径验证通过测试发现一个关键现象# 用docker cp可以成功复制文件 docker cp test.txt ds-china:/var/www/onlyoffice/documentserver/web-apps # 输出Successfully copied 2.05kB to ds-china:/var/www/onlyoffice/documentserver/web-apps # 但容器内查看是空的 docker exec ds-china ls -la /var/www/onlyoffice/documentserver/web-apps # 输出total 0 # 宿主机目录有内容 ls /home/yxc/data/onlyoffice/web-apps # 输出apps test.txt vendor这个现象说明挂载确实生效了但挂载时宿主机目录是空的。根本原因问题出在操作顺序上容器启动时Docker用空的宿主机目录覆盖了容器内的目录启动后虽然可以用docker cp复制文件但这些文件进入了容器内的原始位置不是挂载点看到的空目录实际看到的是挂载点的内容空的宿主机目录解决方案正确操作步骤# 1. 确保容器启动前宿主机目录有内容 # 从其他运行中的容器复制如果有的话 docker cp 其他容器名:/var/www/onlyoffice/documentserver/web-apps/. /home/yxc/data/onlyoffice/web-apps/ # 或者从镜像创建临时容器复制 docker run -d --name temp-cp docker.1ms.run/moqisoft/documentserver:9.3.1 sleep 30 docker cp temp-cp:/var/www/onlyoffice/documentserver/web-apps/. /home/yxc/data/onlyoffice/web-apps/ docker stop temp-cp docker rm temp-cp # 2. 验证宿主机目录有内容 ls -la /home/yxc/data/onlyoffice/web-apps/ # 3. 停止并删除旧容器 docker stop ds-china docker rm ds-china # 4. 重新创建容器挂载点现在有内容了 docker run -itd \ --name ds-china \ -p 9000:80 \ -p 9090:8000 \ --restartalways \ --privileged \ -e ALLOW_PRIVATE_IP_ADDRESStrue \ -e JWT_ENABLEDfalse \ -v /home/yxc/data/onlyoffice/Data:/var/www/onlyoffice/Data \ -v /home/yxc/data/onlyoffice/App_Data:/var/www/onlyoffice/App_Data \ -v /home/yxc/data/onlyoffice/cpuinfo:/host/proc/cpuinfo \ -v /home/yxc/data/onlyoffice/class:/host/sys/class \ -v /home/yxc/data/onlyoffice/web-apps:/var/www/onlyoffice/documentserver/web-apps \ docker.1ms.run/moqisoft/documentserver:9.3.1一键初始化脚本#!/bin/bash # init-docker-mount.sh CONTAINER_NAMEds-china IMAGEdocker.1ms.run/moqisoft/documentserver:9.3.1 HOST_DIR/home/yxc/data/onlyoffice/web-apps CONTAINER_DIR/var/www/onlyoffice/documentserver/web-apps # 1. 停止并删除旧容器 echo 停止并删除旧容器... docker stop $CONTAINER_NAME 2/dev/null docker rm $CONTAINER_NAME 2/dev/null # 2. 准备宿主机目录 echo 准备宿主机目录... mkdir -p $HOST_DIR # 3. 如果目录为空从镜像复制内容 if [ -z $(ls -A $HOST_DIR) ]; then echo 从镜像复制初始内容... docker run -d --name temp-init $IMAGE sleep 30 docker cp temp-init:$CONTAINER_DIR/. $HOST_DIR/ docker stop temp-init docker rm temp-init fi # 4. 设置正确权限 chmod -R 755 $HOST_DIR # 5. 启动容器 echo 启动新容器... docker run -itd \ --name $CONTAINER_NAME \ -p 9000:80 \ -p 9090:8000 \ --restartalways \ --privileged \ -e ALLOW_PRIVATE_IP_ADDRESStrue \ -e JWT_ENABLEDfalse \ -v /home/yxc/data/onlyoffice/Data:/var/www/onlyoffice/Data \ -v /home/yxc/data/onlyoffice/App_Data:/var/www/onlyoffice/App_Data \ -v /home/yxc/data/onlyoffice/cpuinfo:/host/proc/cpuinfo \ -v /home/yxc/data/onlyoffice/class:/host/sys/class \ -v $HOST_DIR:$CONTAINER_DIR \ $IMAGE echo 完成常见问题排查指南1. 目录显示为空检查宿主机目录在容器启动前是否有内容命令ls -la /宿主机/路径/解决容器启动前先填充内容2. 权限问题检查容器内用户 vs 宿主机文件所有者命令docker exec 容器名 id和ls -ld /宿主机/路径/解决chown或chmod调整权限3. 路径不存在检查容器内路径是否正确命令docker exec 容器名 ls -la /容器内/路径/解决确认镜像的实际目录结构4. SELinux限制检查getenforce解决setenforce 0或添加SELinux标签5. 挂载未生效检查docker inspect 容器名 | grep -A5 -B5 挂载点解决检查Docker命令语法重启Docker服务经验总结挂载时机Docker挂载在容器启动时完成不是运行时覆盖行为宿主机目录完全覆盖容器内目录内容先行启动容器前确保宿主机目录有正确内容权限匹配确保容器内用户能访问宿主机文件路径验证确认容器内的挂载点路径存在相关命令参考# 查看容器挂载信息 docker inspect 容器名 | grep -A10 Mounts # 查看容器内目录 docker exec 容器名 ls -la /路径/ # 查看容器用户 docker exec 容器名 id # 测试文件同步 echo test /宿主机/路径/test.txt docker exec 容器名 cat /容器内/路径/test.txt # 从容器复制文件 docker cp 源容器:/路径/. /宿主机/目标路径/希望这篇记录能帮助遇到类似问题的开发者。Docker挂载虽然简单但细节决定成败