-
-
Save mattes/4d7f435d759ca2581347 to your computer and use it in GitHub Desktop.
#!/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'" |
@tonivdv Are you referencing the network settings for NAT or for the Host Only Network in your comments?
@nathanleclaire Sorry that I didn't respond sooner (mentions in gist don't work/notify). I set it for both NAT and Host Only Network. Not sure if one of the two is good enough. I should play with it to really know.
@nathanleclaire I made the test, and only the "Host only adapter" should be changed to PCnet-FAST III to have high performance :)
Thanks, why -maproot=root and not -mapall=USER:GROUP ?
@tomdavidson, it's better USER:GROUP indeed!
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
Currently I have switched mine to use -mapall=uid:gid and that seems to work well for me.
Actually by looking at the virtualbox documentation it has nothing todo with a mac adapter (I was mislead with the INTEL PRO stuff).
From https://www.virtualbox.org/manual/ch06.html#nichardware
Anyway this is all out of scope of this gist. Sorry @mattes for spamming here.