Sign inSign up

hejiazhen/nfs-server

By hejiazhen

•Updated over 6 years ago

NFS v4 Server

Image
0

1.4K

hejiazhen/nfs-server repository overview

⁠Run
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
⁠Add exportfs

*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

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

Tag summary

Content type

Image

Digest

Size

7.2 MB

Last updated

over 6 years ago

docker pull hejiazhen/nfs-server