Permalink
Fetching contributors…
Cannot retrieve contributors at this time
162 lines (143 sloc) 5.38 KB
# -*- mode: ruby -*-
# vi: set ft=ruby :
#
# dvm - Effortless Docker-in-a-box for unsupported Docker platforms
# For more details, please visit http://fnichol.github.io/dvm
#
def shq(s) # sh(1)-style quoting
sprintf("'%s'", s.gsub(/'/, "'\\\\''"))
end
ip = ENV.fetch("DOCKER_IP", "192.168.42.43")
port = ENV.fetch("DOCKER_PORT", "2375")
memory = ENV.fetch("DOCKER_MEMORY", "512")
cpus = ENV.fetch("DOCKER_CPUS", "1")
cidr = ENV.fetch("DOCKER0_CIDR", "")
args = ENV.fetch("DOCKER_ARGS", "")
b2d_version = "1.2.0"
release_url = "https://github.com/fnichol/boot2docker-vagrant-box/releases/download/v#{b2d_version}"
docker0_bridge_setup = ""
bridge_utils_url = "ftp://ftp.nl.netbsd.org/vol/2/metalab/distributions/tinycorelinux/4.x/x86/tcz/bridge-utils.tcz"
unless cidr.empty?
args += " --bip=#{cidr}"
as_docker_usr = 'su - docker -c'
dl_dir = '/home/docker'
filename = 'bridge-utils.tcz'
dl_br_utils = "wget -P #{dl_dir} -O #{filename} #{shq(bridge_utils_url)}"
install_br_utils = "tce-load -i #{dl_dir}/#{filename}"
brctl = '/usr/local/sbin/brctl'
ifcfg = '/sbin/ifconfig'
take_docker0_down = "#{ifcfg} docker0 down"
delete_docker0 = "#{brctl} delbr docker0"
docker0_bridge_setup = <<-BRIDGE_SETUP
sudo $INITD stop
echo #{shq("#{as_docker_usr} #{shq(dl_br_utils)}")}
#{as_docker_usr} #{shq(dl_br_utils)}
echo #{shq("#{as_docker_usr} #{shq(install_br_utils)}")}
#{as_docker_usr} #{shq(install_br_utils)}
sudo #{take_docker0_down}
sudo #{delete_docker0}
BRIDGE_SETUP
end
def tinycore_supported?
Gem::Version.new(Vagrant::VERSION) >= Gem::Version.new("1.5.0")
end
module VagrantPlugins
module GuestTinyCore
module Cap ; end
class Plugin < Vagrant.plugin("2")
name "TinyCore Linux guest."
description "TinyCore Linux guest support."
if !tinycore_supported?
guest("tinycore", "linux") do
class ::VagrantPlugins::GuestTinyCore::Guest < Vagrant.plugin("2", :guest)
def detect?(machine)
machine.communicate.test("cat /etc/issue | grep 'Core Linux'")
end
end
Guest
end
end
if !tinycore_supported?
guest_capability("tinycore", "halt") do
class ::VagrantPlugins::GuestTinyCore::Cap::Halt
def self.halt(machine)
machine.communicate.sudo("poweroff")
rescue IOError
# Do nothing, because it probably means the machine shut down
# and SSH connection was lost.
end
end
Cap::Halt
end
end
guest_capability("tinycore", "configure_networks") do
class ::VagrantPlugins::GuestTinyCore::Cap::ConfigureNetworks
def self.configure_networks(machine, networks)
require 'ipaddr'
machine.communicate.tap do |comm|
networks.each do |n|
ifc = "/sbin/ifconfig eth#{n[:interface]}"
pid = "/var/run/udhcpc.eth#{n[:interface]}.pid"
broadcast = (IPAddr.new(n[:ip]) | (~ IPAddr.new(n[:netmask]))).to_s
comm.sudo("#{ifc} down")
comm.sudo("if [ -f #{pid} ]; then kill `cat #{pid}` && rm -f #{pid}; fi")
comm.sudo("#{ifc} #{n[:ip]} netmask #{n[:netmask]} broadcast #{broadcast}")
comm.sudo("#{ifc} up")
end
end
end
end
Cap::ConfigureNetworks
end
end
end
end
Vagrant.configure("2") do |config|
config.vm.box = "boot2docker-#{b2d_version}"
config.vm.network "forwarded_port",
guest: 2375, host: 2375, id: "docker", disabled: true
config.vm.network "private_network", :ip => ip
config.vm.provider :virtualbox do |v, override|
override.vm.box_url = "#{release_url}/boot2docker_virtualbox.box"
v.customize ["modifyvm", :id, "--natdnsproxy1", "on"]
v.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
v.customize ["modifyvm", :id, "--memory", Integer(memory)]
v.customize ["modifyvm", :id, "--cpus", Integer(cpus)]
end
["vmware_fusion", "vmware_workstation"].each do |vmware|
config.vm.provider vmware do |v, override|
override.vm.box_url = "#{release_url}/boot2docker_vmware.box"
v.vmx["memsize"] = Integer(memory)
v.vmx["numvcpus"] = Integer(cpus)
end
end
config.vm.provider :parallels do |v, override|
override.vm.box_url = "#{release_url}/boot2docker_parallels.box"
v.memory = Integer(memory)
v.cpus = Integer(cpus)
end
args = "export EXTRA_ARGS=#{shq args.strip}" unless args.empty?
config.vm.provision :shell, :inline => <<-PREPARE
INITD=/usr/local/etc/init.d/docker
PROFILE=/var/lib/boot2docker/profile
#{docker0_bridge_setup}
rm -f $PROFILE && touch $PROFILE
if [ #{port} -ne '2375' ]; then
echo "---> Configuring docker to listen on port '#{port}'"
echo "export DOCKER_HOST='-H tcp://0.0.0.0:#{port}'" >> $PROFILE
fi
if [ -n #{shq(args)} ]; then
echo '---> Configuring docker with args "'#{shq(args)}'"'
echo #{shq(args)} >> $PROFILE
fi
if ! grep -q '8\.8\.8\.8' /etc/resolv.conf >/dev/null; then
echo "nameserver 8.8.8.8" >> /etc/resolv.conf
fi
if [ -s "$PROFILE" ]; then
echo '---> Restarting docker daemon'
sudo $INITD restart
fi
echo "boot2docker: $(cat /etc/version)"
PREPARE
config.vm.define :dvm
end