Skip to content

Instantly share code, notes, and snippets.

@mattes
Last active December 4, 2023 12:07
Show Gist options
  • Star 33 You must be signed in to star a gist
  • Fork 13 You must be signed in to fork a gist
  • Save mattes/4d7f435d759ca2581347 to your computer and use it in GitHub Desktop.
Save mattes/4d7f435d759ca2581347 to your computer and use it in GitHub Desktop.
docker-machine/ boot2docker with NFS instead of vboxsf
#!/usr/bin/env ruby
# Usage
# $ docker-machine create my-machine123 -d virtualbox
# $ ruby <(curl -L https://git.io/vvvco) my-machine123
# https://gist.github.com/mattes/4d7f435d759ca2581347
require 'erb'
bootlocalsh = %Q(#/bin/bash
sudo umount /Users
sudo /usr/local/etc/init.d/nfs-client start
sudo mount -t nfs -o noacl,async <%= vboxnet_ip %>:/Users /Users
)
if ARGV.length != 1
puts "usage: #{__FILE__} machine-name"
exit 1
end
machine_name = ARGV[0]
print "Get vboxnet ip addres ..."
# get host only adapter
vboxnet_name = `VBoxManage showvminfo #{machine_name} --machinereadable | grep hostonlyadapter`
vboxnet_name = vboxnet_name.scan(/"(.*)"/).flatten.first.chomp
if vboxnet_name == ''
puts "error: unable to find name of vboxnet"
exit 1
end
# get ip addr for vboxnet
vboxnet_ip = ''
vboxnets = `VBoxManage list hostonlyifs`.split("\n\n")
vboxnets.each do |vboxnet|
if vboxnet.scan(/Name: *(.+?)\n/).flatten.first.chomp == vboxnet_name
vboxnet_ip = vboxnet.scan(/IPAddress: *(.*)\n/).flatten.first.chomp
break
end
end
if vboxnet_ip == ''
puts "error: unable to find ip of vboxnet #{vboxnet_name}"
exit 1
end
print " #{vboxnet_ip}\n"
# create record in local /etc/exports and restart nsfd
machine_ip = `docker-machine ip #{machine_name}`.chomp
puts "Update /etc/exports ..."
`echo '\n/Users #{machine_ip} -alldirs -maproot=root\n' | sudo tee -a /etc/exports`
`awk '!a[$0]++' /etc/exports | sudo tee /etc/exports` # removes duplicate lines
`sudo nfsd restart`; sleep 2
puts `sudo nfsd checkexports`
# render bootlocal.sh and copy bootlocal.sh over to boot2docker
# (this will override an existing /var/lib/boot2docker/bootlocal.sh)
puts "Update boot2docker virtual machine ..."
bootlocalsh_rendered = ERB.new(bootlocalsh).result()
first = true
bootlocalsh_rendered.split("\n").each do |l|
`docker-machine ssh #{machine_name} 'echo "#{l}" | sudo tee #{first ? '' : '-a'} /var/lib/boot2docker/bootlocal.sh'`
first = false
end
`docker-machine ssh #{machine_name} 'sudo chmod +x /var/lib/boot2docker/bootlocal.sh'`
puts "Restart #{machine_name} ..."
`docker-machine restart #{machine_name}`
puts "Done."
puts
puts "Run `docker-machine ssh #{machine_name} df` to check if NFS is mounted."
puts "Output should include something like this: '#{vboxnet_ip}:/Users [...] /Users'"
@tomdavidson
Copy link

Thanks, why -maproot=root and not -mapall=USER:GROUP ?

@tonivdv
Copy link

tonivdv commented Jun 23, 2015

@tomdavidson, it's better USER:GROUP indeed!

@tomdavidson
Copy link

I dont know whats better or not, just that I can not manage to get the right permissions of the host volumes for a database with the user & group of mysql to be able to write to the share. What would be the implications of -mapall=USER, with no group?

https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man5/exports.5.html

@ianlintner-wf
Copy link

Currently I have switched mine to use -mapall=uid:gid and that seems to work well for me.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment