boot2docker together with VirtualBox Guest Additions
How to mount /Users into boot2docker
Using boot2docker with my Mac, I want to seamlessly run something like:
docker run -i -t -v /Users/mattes/project1:/data/project1 ubuntu /bin/bash
UPDATE 17 Oct 2014:
As of Docker version 1.3 the work-around described in this blog post becomes obsolete.
Please read more here: https://blog.docker.com/2014/10/docker-1-3-signed-images-process-injection-security-options-mac-shared-directories
tl;dr Build your own custom boot2docker.iso with VirtualBox Guest Additions (see link) or download http://static.dockerfiles.io/boot2docker-v1.2.0-virtualbox-guest-additions-v4.3.14.iso and save it to ~/.boot2docker/boot2docker.iso.
The issue is that boot2docker doesn’t support
-v /Users/mattes/project1:/data/project1 out of the box since it doesn’t include VirtualBox Guest Additions. It’s still unclear to me, if the VirtualBox Guest Additions will make it into boot2docker any time soon/ ever.
“we’re making boot2docker as simple and small as possible — so at this point, adding tools that are not relevant to all usecases (bare HW, vbox, vagrant, hyper-v, vmware, kvm, etc) is not on the plan. This may change in future, but we havn’t completed our original feature set yet.”
SvenDowideit (boot2docker repo owner) commented on May 30 (link)
Though, there is a pull request to include VB guest additions, see https://github.com/boot2docker/boot2docker/pull/284
So I tried to built my own custom boot2docker.iso following the steps from the pull request above. I ran into a lot of issues and problems, so I thought it would be nice to document the steps that worked out for me.
Prerequisites: The following assumes you already have boot2docker installed. If not, follow http://docs.docker.com/installation/mac and use the Docker OSX Installer. Or use brew:
brew install docker
brew install boot2docker
Okay, so I basically build a new boot2docker.iso with this Dockerfile. It is completely based on the PR from steeve and all credits should go to him. In order to make the mount of /Users permanent for every boot2docker up I had to add some additional lines. See here. Personally, I think this hack is ugly. But I couldn’t find another way of doing it at the moment. (There is /var/lib/boot2docker/bootsync.sh for example, which might be a better place.)
Building that Dockerfile should save the boot2docker.iso in the resulting Docker image. To copy that iso file to the host system I often see:
# this does not work for me
$ docker run -i -t --rm mattes/boot2docker-vbga > boot2docker.iso
… which returns either an empty file or an iso file which doesn’t boot correctly. I tried that with different Docker versions and with Docker 1.0 obviously. The only thing that worked for me was:
# this works...
$ docker run -i -t --rm mattes/boot2docker-vbga /bin/bash
# and then in another shell:
$ docker cp <Container-ID>:boot2docker.iso boot2docker.iso
So once you have your fresh boot2docker.iso on your host system replace the old one at ~/.boot2docker/boot2docker.iso:
$ boot2docker stop
$ mv ~/.boot2docker/boot2docker.iso ~/.boot2docker/boot2docker.iso.backup
$ mv boot2docker.iso ~/.boot2docker/boot2docker.iso
Now let VirtualBox know, which path you want to mount:
$ VBoxManage sharedfolder add boot2docker-vm -name home -hostpath /Users
And this should be it. Let’s verify.
$ boot2docker up
$ boot2docker ssh "ls /Users"
Guest
Shared
mattes
Now you can …
docker run -i -t -v /Users/mattes/project1:/data/project1 ubuntu /bin/bash
For the lazy: You could just download http://static.dockerfiles.io/boot2docker-v1.2.0-virtualbox-guest-additions-v4.3.14.iso and move it to ~/.boot2docker/boot2docker.iso. Make sure to stop boot2docker before. Find the build log here.
EDIT 20 Jun 2014: updated boot2docker to version 1.0.1
EDIT 7 Jul 2014: updated boot2docker to version 1.1.0
Edit 11 Jul 2014: updated boot2docker to version 1.1.1
Edit 24 Jul 2014: updated boot2docker to version 1.1.2
Edit 14 Aug 2014: updated brew install commands
Edit 24 Aug 2014: updated boot2docker to version 1.2.0 and vbox to 4.3.14