Docker 中的 NFS:exportfs: <path> 不支持 NFS 导出
Posted
技术标签:
【中文标题】Docker 中的 NFS:exportfs: <path> 不支持 NFS 导出【英文标题】:NFS in Docker: exportfs: <path> does not support NFS export 【发布时间】:2016-03-20 05:58:20 【问题描述】:我正在开发一个 docker NFS 容器,但在挂载导出的目录时遇到了问题(即使在本地主机上)。
问题
exportfs: <path> does not support NFS export
设置
我的容器使用入口点脚本
将目录(通过命令行参数提供)写入/etc/exports
,
调用rpcbind
和service nfs-kernel-server start
,并且
推迟到inotifywait
继续运行。
Dockerfile 没什么特别的。我安装了inotify-tools
和nfs-kernel-server
,暴露端口2049,并复制入口点脚本。
我在 El Capitan Macbook 上使用 docker-machine
。
我将卷从主机映射到容器中,以使 nfs 服务器能够访问我想要导出的目录。
入口点脚本
modprobe nfs
modprobe nfsd
for x in $@; do
echo -e "$x\t*(rw,sync,no_subtree_check,crossmnt,fsid=root,no_root_squash)" >> /etc/exports
done
source /etc/default/nfs-kernel-server
source /etc/default/nfs-common
rpcbind
service nfs-kernel-server start
exec inotifywait --monitor /exports
调试
这是我要导出的设置。
%> ls $HOME/mounts
a
%> ls $HOME/mounts/a
asdf
这是我启动服务器的方法。
%> docker run --privileged --rm --name=nfs-server --volume=$HOME/mounts/a/:/exports/a docker-nfs-server /exports/a
Exporting directories for NFS kernel daemon...exportfs: /exports/a does not support NFS export
.
Starting NFS kernel daemon: nfsd mountd.
Setting up watches.
Watches established.
这是我在容器运行时一直在做的调试。
%> docker exec -it nfs-server bash
root@6056a33f061e:/# ls /exports
a
root@6056a33f061e:/# ls /exports/a
asdf
root@6056a33f061e:/# showmount -a
All mount points on 6056a33f061e:
root@6056a33f061e:/# exportfs -a
exportfs: /exports/a does not support NFS export
root@8ad67c951ecd:/# mount
none on / type aufs (rw,relatime,si=3ca85db062268b32,dio,dirperm1)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev type tmpfs (rw,nosuid,mode=755)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=666)
mqueue on /dev/mqueue type mqueue (rw,nosuid,nodev,noexec,relatime)
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
tmpfs on /sys/fs/cgroup type tmpfs (rw,nosuid,nodev,noexec,relatime,mode=755)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/cpu type cgroup (rw,nosuid,nodev,noexec,relatime,cpu)
cgroup on /sys/fs/cgroup/cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/net_cls type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_prio)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
/dev/sda1 on /exports type ext4 (rw,relatime,data=ordered)
Users on /exports/a type vboxsf (rw,nodev,relatime)
/dev/sda1 on /etc/resolv.conf type ext4 (rw,relatime,data=ordered)
/dev/sda1 on /etc/hostname type ext4 (rw,relatime,data=ordered)
/dev/sda1 on /etc/hosts type ext4 (rw,relatime,data=ordered)
shm on /dev/shm type tmpfs (rw,nosuid,nodev,noexec,relatime,size=65536k)
nfsd on /proc/fs/nfsd type nfsd (rw,relatime)
我知道的
比琼恩·雪诺还小。我可以确定一些可能导致我的问题的变量,但我不知道如何验证它们中的任何一个:
$HOME/mounts/a
在 OSX 文件系统上
该文件系统已加密
/exports/a
正在安装到 docker-machine 虚拟机中
我没有足够的 NFS 经验来知道如何有效地调试它。任何帮助或信息将不胜感激。
更新
它可以在 Parallels 中运行!
%> docker run --privileged --rm --name=nfs-server --volume=$HOME/mounts/a/:/exports/a docker-nfs-server /exports/a
%> docker exec -it nfs-server bash
root@3786d888f039:/# mkdir --parents /imports/a
root@3786d888f039:/# mount --types nfs --options nolock,proto=tcp,port=2049 localhost:/exports/a /imports/a
root@3786d888f039:/# ls /imports
a
root@3786d888f039:/# ls /imports/a
root@3786d888f039:/# ls /exports
a
root@3786d888f039:/# ls /exports/a
root@3786d888f039:/# touch /exports/a/asdf
root@3786d888f039:/# ls /exports/a
asdf
root@3786d888f039:/# ls /imports/a/
asdf
这样就可以将问题缩小到 OSX/docker-machine 甚至 OSX 上的加密文件系统。
【问题讨论】:
【参考方案1】:问题出在码头机器上。如果你想使用 nfs 挂载,你需要在机器本身而不是容器中运行 modprobe nfs。容器使用机器的内核。与 modprobe nfs 和 nfs 服务器相同。
【讨论】:
【参考方案2】:在我的情况下,当导出的路径是 dockerfile 中指定的卷时,它可以工作。 Here 是我让它工作的仓库(使用替换的卷定义)。
【讨论】:
以上是关于Docker 中的 NFS:exportfs: <path> 不支持 NFS 导出的主要内容,如果未能解决你的问题,请参考以下文章
Linux基础命令---exportfs管理挂载的nfs文件系统