在 Ubuntu 22.04 上用 docker run 起 ollama/ollama 0.5.7,把宿主目录 /data/ollama 挂到容器的 /root/.ollama,容器起来后执行 ollama pull qwen2.5:7b 报 Error: permission denied,宿主目录权限已经改成 777,删掉容器重建还是同样的错。
一开始怀疑是「SELinux 或 AppArmor 拦住了容器对挂载路径的写入」,查了一圈,方向不对。
把日志和配置对完,能解释这个现象的基本就这几处。容器里的 ollama 以 uid 1000 运行,宿主目录属主是 root。另一种情况是宿主目录在 NFS 上,root_squash 把写入操作降权到 nobody。
不容易想到的是,挂载的是单个文件而不是目录,容器内路径被当成普通文件。
先查看容器内进程 uid 和挂载点属主
docker exec -it ollama id; ls -ln /data/ollama
再往下把宿主目录改成容器内 uid 可写
sudo chown -R 1000:1000 /data/ollama
然后在 SELinux 机器上加标签后重启容器
docker run -d --name ollama -v /data/ollama:/root/.ollama:z ollama/ollama:0.5.7
再拉一次模型确认能落盘
docker exec ollama ollama pull qwen2.5:7b
恢复的判定其实很直接。拉取进度条走到 success,宿主目录里出现 blobs 与 manifests 两个子目录,重启容器后 ollama list 仍能看到该模型。
挂载目录在容器里看是 permission denied,在宿主上看却是 777,得对着 uid 比,不是对着 rwx 比。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
