Ubuntu 18.04下Vagrant与Docker文件挂载失败求助
先处理你更新中的明显挂载错误
你在测试nginx时遇到的错误是典型的挂载类型不匹配:你试图把本地的testfile.txt文件挂载到容器内的/etc/nginx目录路径上,Docker不允许将文件挂载到目录位置,反之亦然。
修复方法:
- 如果你想把本地文件放到容器的
/etc/nginx目录下,需要指定具体的文件路径:volumes: - ./testfile.txt:/etc/nginx/testfile.txt - 如果你想挂载本地目录到容器的
/etc/nginx,请先在本地创建对应目录(比如./nginx-config),将文件放入后再配置:volumes: - ./nginx-config:/etc/nginx/
针对SaltStack Docker挂载空目录的问题
从docker inspect的输出看,挂载配置本身是正确的,但容器内挂载点为空,结合你的Ubuntu 18.04环境,按以下步骤排查:
确认本地目录是否有内容
先在本地主机上检查要挂载的目录是否存在文件:ls -l ${PWD}/assets/master/etc/supervisor/ ls -l ${PWD}/assets/master/etc/salt/如果你本地的
assets/master/etc/supervisor/里没有supervisord.conf,容器自然找不到这个文件——挂载空目录到容器,结果肯定是空的。检查本地目录权限
Docker默认以root运行,但Ubuntu的文件权限可能限制了Docker的访问。先查看目录权限:ls -ld ${PWD}/assets/确保权限至少为
755(所有者读/写/执行,其他用户读/执行),如果权限过严(比如700),Docker进程可能无法读取目录内容。你也可以尝试用root权限运行
docker-compose,排查是否是普通用户权限不足:sudo docker-compose up排查AppArmor的限制
Ubuntu 18.04默认启用AppArmor,它可能会阻止Docker挂载本地目录。你可以临时关闭测试:sudo systemctl stop apparmor sudo systemctl disable apparmor重新运行
docker-compose up后如果挂载正常,说明需要调整AppArmor规则来允许Docker访问这些目录(生产环境不建议直接关闭)。清理Docker旧数据
你怀疑/var/lib/docker有问题,可以清理Docker缓存和旧资源(注意:这会清除所有Docker容器、镜像、卷,谨慎操作):# 停止所有运行中的容器 sudo docker stop $(docker ps -aq) # 清理所有Docker资源 sudo docker system prune -a --volumes之后重新拉取镜像、构建项目即可。
针对Vagrant挂载问题的通用排查思路
结合你提到的Vagrant挂载失败,可从以下方向入手:
- 检查Vagrantfile中的
synced_folder配置,确认本地路径和虚拟机路径正确,可添加mount_options参数匹配虚拟机用户的UID/GID,比如:config.vm.synced_folder "./local/path", "/vm/path", mount_options: ["uid=1000", "gid=1000"] - 确认虚拟机内的挂载点目录存在,且未被其他进程占用。
- 检查本地目录权限,确保Vagrant进程有读写权限。
- 临时关闭AppArmor,排查是否是它阻止了共享文件夹挂载。
内容的提问来源于stack exchange,提问作者Petrus K.

