在 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 比。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189