Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Use NFS instead of vboxsf in Docker Machine
#!/bin/bash
#
# This script will mount /Users in the boot2docker VM using NFS (instead of the
# default vboxsf). It's probably not a good idea to run it while there are
# Docker containers running in boot2docker.
#
# Usage: sudo ./boot2docker-use-nfs.sh
#
docker-machine ssh default << EOF | grep "already mounted" &> /dev/null
mount | grep nfs > /dev/null && \
echo "/Users already mounted with NFS" && \
exit
EOF
if [ "$?" == "0" ]
then
# Already mounted
exit
fi
if [ "$USER" != "root" ]
then
echo "This script must be run with sudo: sudo ${0}"
exit -1
fi
# Run command as non root http://stackoverflow.com/a/10220200/96855
B2D_IP=$(sudo -u ${SUDO_USER} docker-machine ip default)
if [ "$B2D_IP" == "" ]
then
sudo -u ${SUDO_USER} docker-machine start default
eval "$(sudo -u ${SUDO_USER} docker-machine env default)"
B2D_IP=$(sudo -u ${SUDO_USER} docker-machine ip default &> /dev/null)
#echo "You need to start boot2docker first: boot2docker up && \$(boot2docker shellinit) "
#exit -1
fi
OSX_IP=$(ifconfig en0 | grep --word-regexp inet | awk '{print $2}')
MAP_USER=${SUDO_USER}
MAP_GROUP=$(sudo -u ${SUDO_USER} id -n -g)
RESTART_NFSD=0
EXPORTS_LINE="/Users -mapall=${MAP_USER}:${MAP_GROUP} ${OSX_IP}"
grep "$EXPORTS_LINE" /etc/exports > /dev/null
if [ "$?" != "0" ]
then
RESTART_NFSD=1
# Backup exports file
$(cp -n /etc/exports /etc/exports.bak) && \
echo "Backed up /etc/exports to /etc/exports.bak"
# Delete previously generated line if it exists
grep -v '^/Users ' /etc/exports > /etc/exports
# We are using the OS X IP because the b2d VM is behind NAT
echo "$EXPORTS_LINE" >> /etc/exports
fi
NFSD_LINE="nfs.server.mount.require_resv_port = 0"
grep "$NFSD_LINE" /etc/nfs.conf > /dev/null
if [ "$?" != "0" ]
then
RESTART_NFSD=1
# Backup /etc/nfs.conf file
$(cp -n /etc/nfs.conf /etc/nfs.conf.bak) && \
echo "Backed up /etc/nfs.conf to /etc/nfs.conf.bak"
echo "nfs.server.mount.require_resv_port = 0" >> /etc/nfs.conf
fi
if [ "$RESTART_NFSD" == "1" ]
then
echo "Restarting nfsd"
nfsd update 2> /dev/null || (nfsd start && sleep 5)
fi
sudo -u ${SUDO_USER} docker-machine ssh default << EOF
echo "Unmounting /Users"
sudo umount /Users 2> /dev/null
echo "Starting nfs-client"
sudo /usr/local/etc/init.d/nfs-client start 2> /dev/null
echo "Mounting /Users"
sudo mount $OSX_IP:/Users /Users -o rw,async,noatime,rsize=32768,wsize=32768,proto=tcp,nfsvers=3
echo "Mounted /Users:"
ls -al /Users
exit
EOF
@vortec

This comment has been minimized.

Copy link

vortec commented Jan 20, 2016

Hi, thanks for this! It works great, but I'm getting an error message right at the beginning:

"machine does not exist"

I think as root it won't find the VBox that was started as my local user?

@ekkis

This comment has been minimized.

Copy link

ekkis commented Jul 3, 2016

here was my experience:

$ sudo docker-machine-use-nfs.sh

Password:
machine does not exist
grep: /etc/exports: No such file or directory
cp: /etc/exports: No such file or directory
Backed up /etc/nfs.conf to /etc/nfs.conf.bak
Restarting nfs
Starting the nfs service
Boot2Docker version 1.12.0-rc2, build HEAD : 52952ef - Fri Jun 17 21:01:09 UTC 2016
Docker version 1.12.0-rc2, build 906eacd
Unmounting /Users
Starting nfs-client
Starting nfs client utilities.
Mounting /Users
mount: RPC: Remote system error - Connection refused
mount: mounting 192.168.1.67:/Users on /Users failed: Bad file descriptor
Mounted /Users:
total 0
drwxr-xr-x 2 root root 40 Jul 3 01:10 ./
drwxr-xr-x 17 tc staff 420 Jul 3 01:10 ../

@ekkis

This comment has been minimized.

Copy link

ekkis commented Jul 3, 2016

and a little more info on it:

$ sudo bash -x docker-machine-use-nfs.sh

  • docker-machine ssh default
  • grep 'already mounted'
    machine does not exist
  • '[' 1 == 0 ']'
  • '[' root '!=' root ']'
    ++ sudo -u ekkis docker-machine ip default
  • B2D_IP=192.168.99.100
  • '[' 192.168.99.100 == '' ']'
    ++ ifconfig en0
    ++ grep --word-regexp init
    ++ awk '{print $2}'
  • OSX_IP=192.168.1.67
  • MAP_USER=ekkis
    ++ sudo -u ekkis id -n -g
  • MAP_GROUP=staff
  • RESTART_NFSD=0
  • EXPORTS_LINE='/Users -mapall=ekkis:staff 192.168.1.67'
  • grep '/Users -mapall=ekkis:staff 192.168.1.67' /etc/exports
  • '[' 0 '!=' 0 ']'
  • NFSD_LINE='nfs.server.mount.require_resv_port = 0'
  • grep 'nfs.server.mount.require_resv_port = 0' /etc/nfs.conf
  • '[' 0 '!=' 0 ']'
  • '[' 0 == 1 ']'

interestingly, I can do docker-machine ssh default and get into the machine... thoughts?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.