docker run -d --name nfs --privileged -p 2049:2049 -v <volume>:/nfsdata hejiazhen/nfs-server:latest
or
docker run -d --name nfs --cap-add SYS_ADMIN --cap-add SETPCAP --network host -v <volume>:/nfsdata hejiazhen/nfs-server:latest
*export :/test exportfs
docker exec nfs add_exportfs --dir=test
export 192.168.10.11:/test2 read-only exportfs
docker exec nfs add_exportfs --dir=test2 --host='192.168.10.11' --ro
mount nfs server rootfs default read-only
mount -t nfs -o vers=4,soft,timeo=5,nolock,port=2049 <nfs-domain>:/ /path/to/mount
mount nfs path /test to local /nfs/mount
mount -t nfs -o vers=4,soft,timeo=5,nolock,port=2049 <nfs-domain>:/test /nfs/mount
add to fstab
<nfs-domain>:/test /nfs/mount nfs vers=4,soft,timeo=5,nolock,port=2049 0 0
Dockerfile
FROM alpine:latest
COPY add_exportfs.sh /usr/bin/add_exportfs
COPY docker-entrypoint.sh /usr/bin/docker-entrypoint.sh
RUN apk add --no-cache --update --verbose nfs-utils bash iproute2 && \
rm -rf /var/cache/apk/* && \
mkdir -p /var/lib/nfs/rpc_pipefs /var/lib/nfs/v4recovery && \
echo "rpc_pipefs /var/lib/nfs/rpc_pipefs rpc_pipefs defaults 0 0" >>/etc/fstab && \
echo "nfsd /proc/fs/nfsd nfsd defaults 0 0" >>/etc/fstab && \
chmod +x /usr/bin/add_exportfs /usr/bin/docker-entrypoint.sh
EXPOSE 2049
VOLUME /nfsdata
ENTRYPOINT ["/usr/bin/docker-entrypoint.sh"]
add_exportfs.sh
#!/bin/bash
rwo="rw"
host="*"
GETOPT_ARGS=`getopt -o d: -l dir:,host:,ro -n "$0" -- "$@"`
if [[ $? -ne 0 ]]; then
exit 1
fi
eval set -- "${GETOPT_ARGS}"
while true;do
case "${1}" in
-d|--dir) dir="${2}" ; shift 2 ;;
--host) host="${2}" ; shift 2 ;;
--ro) rwo="ro" ; shift ;;
--) shift ; break ;;
*) echo "Internal error!" ; exit 1 ;;
esac
done
if [[ "X${dir}" == "X" ]] || [[ "X${host}" == "X" ]] || [[ "X${rwo}" == "X" ]];then
echo "Usage: bash $(basename $0) --dir='xxx' [--host='xxx'] [--ro]"
exit 2
fi
dir=$(echo ${dir} | awk '{gsub(/^\/+/, "");print}')
if grep -qE "/nfsdata/root/${dir}" /etc/exports;then
echo "${dir} already exists."
exit
fi
mkdir -p /nfsdata/${dir} /nfsdata/root/${dir}
mount --bind /nfsdata/${dir} /nfsdata/root/${dir}
echo "/nfsdata/${dir} /nfsdata/root/${dir} none defaults,bind,rw,auto 0 0" >>/etc/fstab
echo "/nfsdata/root/${dir} ${host}(sync,wdelay,nohide,no_subtree_check,insecure_locks,sec=sys,${rwo},insecure,no_root_squash,no_all_squash)" >>/etc/exports
exportfs -rv
docker-entrypoint.sh
#!/bin/bash
pre_check(){
if [[ ! -d /nfsdata ]];then
echo "No such file or directory: /nfsdata"
echo "pls mount your filesystem to :/nfsdata."
exit 1
else
if [[ "`stat -f -c %T /nfsdata`" == "UNKNOWN" ]];then
echo "/nfsdata does not support NFS export."
exit 1
fi
fi
}
add_exportfs(){
mkdir -p /nfsdata/root
if ! grep -qE "^/nfsdata/root " /etc/exports;then
echo "/nfsdata/root *(ro,sync,fsid=0,no_subtree_check,no_auth_nlm,insecure,no_root_squash)" >>//etc/exports
fi
}
_start(){
/sbin/rpcbind -w
/sbin/rpcinfo
# Only required if v3 will be used
# /usr/sbin/rpc.idmapd
# /usr/sbin/rpc.gssd -v
# /usr/sbin/rpc.statd
if ! /usr/sbin/exportfs -rv;then
echo "export error."
exit 2
fi
if ! /usr/sbin/rpc.nfsd --debug 8 --no-udp --no-nfs-version 2 --no-nfs-version 3;then
echo "Please try the docker run opts with: --privileged or --cap-add SYS_ADMIN --cap-add SETPCAP."
exit 2
fi
/usr/sbin/rpc.mountd --no-udp --no-nfs-version 2 --no-nfs-version 3 -F
}
mount -a
pre_check
add_exportfs
_start
Content type
Image
Digest
Size
7.2 MB
Last updated
over 6 years ago
docker pull hejiazhen/nfs-server