mirror of
				https://github.com/moby/moby.git
				synced 2022-11-09 12:21:53 -05:00 
			
		
		
		
	 297001f515
			
		
	
	
		297001f515
		
	
	
	
	
		
			
			This bumps the VM memory and corrects forwarded ports when they're used already. Docker-DCO-1.1-Signed-off-by: Cristian Staretu <cristian.staretu@gmail.com> (github: unclejack)
		
			
				
	
	
		
			206 lines
		
	
	
	
		
			8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			206 lines
		
	
	
	
		
			8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| # -*- mode: ruby -*-
 | |
| # vi: set ft=ruby :
 | |
| 
 | |
| BOX_NAME = ENV['BOX_NAME'] || "ubuntu"
 | |
| BOX_URI = ENV['BOX_URI'] || "http://files.vagrantup.com/precise64.box"
 | |
| VF_BOX_URI = ENV['BOX_URI'] || "http://files.vagrantup.com/precise64_vmware_fusion.box"
 | |
| AWS_BOX_URI = ENV['BOX_URI'] || "https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box"
 | |
| AWS_REGION = ENV['AWS_REGION'] || "us-east-1"
 | |
| AWS_AMI = ENV['AWS_AMI'] || "ami-69f5a900"
 | |
| AWS_INSTANCE_TYPE = ENV['AWS_INSTANCE_TYPE'] || 't1.micro'
 | |
| SSH_PRIVKEY_PATH = ENV['SSH_PRIVKEY_PATH']
 | |
| PRIVATE_NETWORK = ENV['PRIVATE_NETWORK']
 | |
| 
 | |
| # Boolean that forwards the Docker dynamic ports 49000-49900
 | |
| # See http://docs.docker.io/en/latest/use/port_redirection/ for more
 | |
| # $ FORWARD_DOCKER_PORTS=1 vagrant [up|reload]
 | |
| FORWARD_DOCKER_PORTS = ENV['FORWARD_DOCKER_PORTS']
 | |
| VAGRANT_RAM = ENV['VAGRANT_RAM'] || 512
 | |
| VAGRANT_CORES = ENV['VAGRANT_CORES'] || 1
 | |
| 
 | |
| # You may also provide a comma-separated list of ports
 | |
| # for Vagrant to forward. For example:
 | |
| # $ FORWARD_PORTS=8080,27017 vagrant [up|reload]
 | |
| FORWARD_PORTS = ENV['FORWARD_PORTS']
 | |
| 
 | |
| # A script to upgrade from the 12.04 kernel to the raring backport kernel (3.8)
 | |
| # and install docker.
 | |
| $script = <<SCRIPT
 | |
| # The username to add to the docker group will be passed as the first argument
 | |
| # to the script.  If nothing is passed, default to "vagrant".
 | |
| user="$1"
 | |
| if [ -z "$user" ]; then
 | |
|     user=vagrant
 | |
| fi
 | |
| 
 | |
| # Enable memory cgroup and swap accounting
 | |
| sed -i 's/GRUB_CMDLINE_LINUX=""/GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"/g' /etc/default/grub
 | |
| update-grub
 | |
| 
 | |
| # Adding an apt gpg key is idempotent.
 | |
| apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
 | |
| 
 | |
| # Creating the docker.list file is idempotent, but it may overwrite desired
 | |
| # settings if it already exists.  This could be solved with md5sum but it
 | |
| # doesn't seem worth it.
 | |
| echo 'deb http://get.docker.io/ubuntu docker main' > \
 | |
|     /etc/apt/sources.list.d/docker.list
 | |
| 
 | |
| # Update remote package metadata.  'apt-get update' is idempotent.
 | |
| apt-get update -q
 | |
| 
 | |
| # Install docker.  'apt-get install' is idempotent.
 | |
| apt-get install -q -y lxc-docker
 | |
| 
 | |
| usermod -a -G docker "$user"
 | |
| 
 | |
| tmp=`mktemp -q` && {
 | |
|     # Only install the backport kernel, don't bother upgrading if the backport is
 | |
|     # already installed.  We want parse the output of apt so we need to save it
 | |
|     # with 'tee'.  NOTE: The installation of the kernel will trigger dkms to
 | |
|     # install vboxguest if needed.
 | |
|     apt-get install -q -y --no-upgrade linux-image-generic-lts-raring | \
 | |
|         tee "$tmp"
 | |
| 
 | |
|     # Parse the number of installed packages from the output
 | |
|     NUM_INST=`awk '$2 == "upgraded," && $4 == "newly" { print $3 }' "$tmp"`
 | |
|     rm "$tmp"
 | |
| }
 | |
| 
 | |
| # If the number of installed packages is greater than 0, we want to reboot (the
 | |
| # backport kernel was installed but is not running).
 | |
| if [ "$NUM_INST" -gt 0 ];
 | |
| then
 | |
|     echo "Rebooting down to activate new kernel."
 | |
|     echo "/vagrant will not be mounted.  Use 'vagrant halt' followed by"
 | |
|     echo "'vagrant up' to ensure /vagrant is mounted."
 | |
|     shutdown -r now
 | |
| fi
 | |
| SCRIPT
 | |
| 
 | |
| # We need to install the virtualbox guest additions *before* we do the normal
 | |
| # docker installation.  As such this script is prepended to the common docker
 | |
| # install script above.  This allows the install of the backport kernel to
 | |
| # trigger dkms to build the virtualbox guest module install.
 | |
| $vbox_script = <<VBOX_SCRIPT + $script
 | |
| # Install the VirtualBox guest additions if they aren't already installed.
 | |
| if [ ! -d /opt/VBoxGuestAdditions-4.3.6/ ]; then
 | |
|     # Update remote package metadata.  'apt-get update' is idempotent.
 | |
|     apt-get update -q
 | |
| 
 | |
|     # Kernel Headers and dkms are required to build the vbox guest kernel
 | |
|     # modules.
 | |
|     apt-get install -q -y linux-headers-generic-lts-raring dkms
 | |
| 
 | |
|     echo 'Downloading VBox Guest Additions...'
 | |
|     wget -cq http://dlc.sun.com.edgesuite.net/virtualbox/4.3.6/VBoxGuestAdditions_4.3.6.iso
 | |
|     echo "95648fcdb5d028e64145a2fe2f2f28c946d219da366389295a61fed296ca79f0  VBoxGuestAdditions_4.3.6.iso" | sha256sum --check || exit 1
 | |
| 
 | |
|     mount -o loop,ro /home/vagrant/VBoxGuestAdditions_4.3.6.iso /mnt
 | |
|     /mnt/VBoxLinuxAdditions.run --nox11
 | |
|     umount /mnt
 | |
| fi
 | |
| VBOX_SCRIPT
 | |
| 
 | |
| Vagrant::Config.run do |config|
 | |
|   # Setup virtual machine box. This VM configuration code is always executed.
 | |
|   config.vm.box = BOX_NAME
 | |
|   config.vm.box_url = BOX_URI
 | |
| 
 | |
|   # Use the specified private key path if it is specified and not empty.
 | |
|   if SSH_PRIVKEY_PATH
 | |
|       config.ssh.private_key_path = SSH_PRIVKEY_PATH
 | |
|   end
 | |
| 
 | |
|   config.ssh.forward_agent = true
 | |
| end
 | |
| 
 | |
| # Providers were added on Vagrant >= 1.1.0
 | |
| #
 | |
| # NOTE: The vagrant "vm.provision" appends its arguments to a list and executes
 | |
| # them in order.  If you invoke "vm.provision :shell, :inline => $script"
 | |
| # twice then vagrant will run the script two times.  Unfortunately when you use
 | |
| # providers and the override argument to set up provisioners (like the vbox
 | |
| # guest extensions) they 1) don't replace the other provisioners (they append
 | |
| # to the end of the list) and 2) you can't control the order the provisioners
 | |
| # are executed (you can only append to the list).  If you want the virtualbox
 | |
| # only script to run before the other script, you have to jump through a lot of
 | |
| # hoops.
 | |
| #
 | |
| # Here is my only repeatable solution: make one script that is common ($script)
 | |
| # and another script that is the virtual box guest *prepended* to the common
 | |
| # script.  Only ever use "vm.provision" *one time* per provider.  That means
 | |
| # every single provider has an override, and every single one configures
 | |
| # "vm.provision".  Much saddness, but such is life.
 | |
| Vagrant::VERSION >= "1.1.0" and Vagrant.configure("2") do |config|
 | |
|   config.vm.provider :aws do |aws, override|
 | |
|     username = "ubuntu"
 | |
|     override.vm.box_url = AWS_BOX_URI
 | |
|     override.vm.provision :shell, :inline => $script, :args => username
 | |
|     aws.access_key_id = ENV["AWS_ACCESS_KEY"]
 | |
|     aws.secret_access_key = ENV["AWS_SECRET_KEY"]
 | |
|     aws.keypair_name = ENV["AWS_KEYPAIR_NAME"]
 | |
|     override.ssh.username = username
 | |
|     aws.region = AWS_REGION
 | |
|     aws.ami    = AWS_AMI
 | |
|     aws.instance_type = AWS_INSTANCE_TYPE
 | |
|   end
 | |
| 
 | |
|   config.vm.provider :rackspace do |rs, override|
 | |
|     override.vm.provision :shell, :inline => $script
 | |
|     rs.username = ENV["RS_USERNAME"]
 | |
|     rs.api_key  = ENV["RS_API_KEY"]
 | |
|     rs.public_key_path = ENV["RS_PUBLIC_KEY"]
 | |
|     rs.flavor   = /512MB/
 | |
|     rs.image    = /Ubuntu/
 | |
|   end
 | |
| 
 | |
|   config.vm.provider :vmware_fusion do |f, override|
 | |
|     override.vm.box_url = VF_BOX_URI
 | |
|     override.vm.synced_folder ".", "/vagrant", disabled: true
 | |
|     override.vm.provision :shell, :inline => $script
 | |
|     f.vmx["displayName"] = "docker"
 | |
|   end
 | |
| 
 | |
|   config.vm.provider :virtualbox do |vb, override|
 | |
|     override.vm.provision :shell, :inline => $vbox_script
 | |
|     vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
 | |
|     vb.customize ["modifyvm", :id, "--natdnsproxy1", "on"]
 | |
|     vb.customize ["modifyvm", :id, "--memory", VAGRANT_RAM]
 | |
|     vb.customize ["modifyvm", :id, "--cpus", VAGRANT_CORES]
 | |
|   end
 | |
| end
 | |
| 
 | |
| # If this is a version 1 config, virtualbox is the only option.  A version 2
 | |
| # config would have already been set in the above provider section.
 | |
| Vagrant::VERSION < "1.1.0" and Vagrant::Config.run do |config|
 | |
|   config.vm.provision :shell, :inline => $vbox_script
 | |
| end
 | |
| 
 | |
| # Setup port forwarding per loaded environment variables
 | |
| forward_ports = FORWARD_DOCKER_PORTS.nil? ? [] : [*49153..49900]
 | |
| forward_ports += FORWARD_PORTS.split(',').map{|i| i.to_i } if FORWARD_PORTS
 | |
| if forward_ports.any?
 | |
|   Vagrant::VERSION < "1.1.0" and Vagrant::Config.run do |config|
 | |
|     forward_ports.each do |port|
 | |
|       config.vm.forward_port port, port
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   Vagrant::VERSION >= "1.1.0" and Vagrant.configure("2") do |config|
 | |
|     forward_ports.each do |port|
 | |
|       config.vm.network :forwarded_port, :host => port, :guest => port, auto_correct: true
 | |
|     end
 | |
|   end
 | |
| end
 | |
| 
 | |
| if !PRIVATE_NETWORK.nil?
 | |
|   Vagrant::VERSION < "1.1.0" and Vagrant::Config.run do |config|
 | |
|     config.vm.network :hostonly, PRIVATE_NETWORK
 | |
|   end
 | |
| 
 | |
|   Vagrant::VERSION >= "1.1.0" and Vagrant.configure("2") do |config|
 | |
|     config.vm.network "private_network", ip: PRIVATE_NETWORK
 | |
|   end
 | |
| end
 | |
| 
 |