Skip to content

Instantly share code, notes, and snippets.

@millisami
Forked from juanje/gist:3797297
Created September 28, 2012 09:04
Show Gist options
  • Save millisami/3798773 to your computer and use it in GitHub Desktop.
Save millisami/3798773 to your computer and use it in GitHub Desktop.
Mount apt cache of a Vagrant box in the host to spin up the packages installation

This is a little trick I use to spin up the packages instalation on Debian/Ubuntu boxes in Vagrant.

I add a simple function that checks if a directory named something similar to ~/.vagrant.d/cache/apt/opscode-ubuntu-12.04/partial (it may have another path in Windows or MacOS) and create the directory if it doesn't already exist.

def local_cache(box_name)
  cache_dir = File.join(File.expand_path(Vagrant::Environment::DEFAULT_HOME),
                        'cache',
                        'apt',
                        box_name)
  partial_dir = File.join(cache_dir, 'partial')
  FileUtils.mkdir_p(partial_dir) unless File.exists? partial_dir
  cache_dir
end

I put this funcion in my Vagrantfile so I can use it like this:

Vagrant::Config.run do |config|
  config.vm.box = "opscode-ubuntu-12.04"
  config.vm.box_url = "https://opscode-vm.s3.amazonaws.com/vagrant/boxes/opscode-ubuntu-12.04.box"
  cache_dir = local_cache(config.vm.box)

  config.vm.share_folder "v-cache",
                         "/var/cache/apt/archives/",
                         cache_dir

end

The result is that the apt cache inside the VM (/var/cache/apt/archives/) is always mounted on the same directory on the host (~/.vagrant.d/cache/apt/opscode-ubuntu-12.04/ in this case) and apt just download the packages the first time or if the package has been updated.

This save me a lot of time while I'm developing or debuging Chef cookbooks. Mostly when my recipes need to install many packages.

@efficacy
Copy link

This is an excellent tip. Many thanks.

It seems the folder share syntax had changed in the version of Vagrant I downloaded. I needed:

config.vm.synced_folder cache_dir, "/var/cache/apt/archives/"

Other than that it worked great!

@urbanautomaton
Copy link

Nifty - thanks very much for sharing.

@gimler
Copy link

gimler commented Jun 6, 2013

Vagrant::Environment::DEFAULT_HOME no more exists change File.expand_path(Vagrant::Environment::DEFAULT_HOME) to File.dirname(FILE)

@webbower
Copy link

Doesn't that make the cache local to the Vagrant project instead of the user's home directory?

@dergachev
Copy link

@gimier File.dirname(__FILE__) is just the path to your Vagrantfile, which means it will not be in the home directory.
Maybe instead hardcode ~/.vagrant/d instead?

Also everybody should be using https://github.com/fgrehm/vagrant-cachier instead. It's like this gist, but a proper Vagrant plugin... and it's awesome!

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