Docker中的NFS:exportfs:<path>不支持NFS导出

6

我正在处理一个docker NFS容器的问题,但在挂载导出的目录时遇到了麻烦(即使是在本地主机上)。

问题描述

exportfs: <path> does not support NFS export

设置

我的容器使用一个入口脚本来:

  • 将提供的目录(通过命令行参数)写入/etc/exports
  • 调用rpcbindservice nfs-kernel-server start,并且
  • 使用inotifywait保持运行状态。

Dockerfile没有什么特别之处。我安装了inotify-toolsnfs-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)

我的了解

我知道的比Jon Snow少。我能够识别一些可能导致问题的变量,但我不知道如何验证它们:

  • $HOME/mounts/a 在OSX文件系统上
  • 该文件系统被加密
  • /exports/a 被挂载到docker-machine VM中

我对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上的加密文件系统。


考虑使用用户空间 NFS 服务器而不是内核支持的服务器;这样需要正确的东西要少得多。请参见 https://github.com/nfs-ganesha/nfs-ganesha/wiki。 - Charles Duffy
3个回答

1
在我的情况下,当导出路径是 Dockerfile 中指定的卷时,它起作用了。这里 是我让它正常工作的存储库(使用替换的卷定义)。

1
这是我的故事。原因是我挂载的硬盘格式为 exfat。如果格式为 ntfsfat32,也可能出现这种情况。为了解决问题,首先将硬盘以 ext4 格式挂载,然后再尝试一次。应该就可以正常工作了。

0

问题出在 Docker Machine 上。如果您想使用 NFS 挂载,您需要在机器本身上运行 modprobe nfs,而不是在容器中运行。容器使用的是机器的内核。modprobe nfs 和 NFS 服务器也一样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接