7

On a Mac, how do you mount a volume to a Docker container?

On my linux box, this is easy. All I need to do is something like -v /src/webapp:/opt/webapp when running the container. But Mac is different since I have to run boot2docker to run a VM in VirtualBox. I've tried running

boot2docker init
boot2docker up
boot2docker ssh # to poke around
boot2docker stop
VBoxManage sharedfolder add "boot2docker-vm" --name "Users" --hostpath /Users
boot2docker up
boot2docker ssh "sudo modprobe vboxsf"

but I get

modprobe: module vboxsf not found in modules.dep

If I ignore that and still try to mount on the VM like so

boot2docker ssh "sudo mkdir /test && sudo mount -t vboxsf Users /test"

I get

mount: mounting Users on /test failed: No such device

I feel like I'm missing something extremely simple, but I can't quite figure it out. Any help would be greatly appreciated.

geowa4
  • 40,390
  • 17
  • 88
  • 107
  • possible duplicate of [Boot2Docker on Mac - Accessing Local Files](http://stackoverflow.com/questions/24212228/boot2docker-on-mac-accessing-local-files) –  Oct 24 '14 at 14:08

2 Answers2

6

Ok, after digging through a GitHub PR, I was able to figure out a way to do this. For the future readers out there, this process should be fixed in an upcoming release of boot2docker.

# assuming boot2docker and VirtualBox are installed
wget http://static.dockerfiles.io/boot2docker-v1.2.0-virtualbox-guest-additions-v4.3.14.iso
mv boot2docker-v1.2.0-virtualbox-guest-additions-v4.3.14.iso ~/.boot2docker/boot2docker.iso
# blow away your old boot2docker-vm if it exists (boot2docker down && boot2docker destroy)
boot2docker init
boot2docker up
# set DOCKER_HOST as instructed
boot2docker stop
VBoxManage sharedfolder add boot2docker-vm --name /Users --hostpath /Users
boot2docker up
# if you ssh into the VM now, you'll notice /Users is present, but empty; I don't know/care why.
boot2docker ssh "sudo mount -t vboxsf -o uid=1000,gid=50 /Users /Users"
# done

This worked for me so I hope it works for others. In the near future, I expect this issue to be solved by boot2docker, especially since the PR from which I got these commands was merged.

EDIT: boot2docker 1.3.0 supports this without any further changes. After updating, I ran these commands:

boot2docker destroy  # start over
boot2docker download # download the udpated ISO
boot2docker init
boot2docker up
# done
geowa4
  • 40,390
  • 17
  • 88
  • 107
  • 1
    The version of boot2docker released yesterday will auto-mount your /Users directory – klochner Oct 17 '14 at 17:52
  • Thanks, I've edited this answer to reflect the updates. – geowa4 Oct 17 '14 at 21:38
  • Why is this necessary if Docker for Mac provides File Sharing in the preferences? I haven't been able to get them to work but I assume that they are intended to provide this functionality? The docs aren't clear about that. – geoidesic Mar 26 '18 at 10:05
3

For folks finding this in the future who want to mount anything other than /Users, there's a script someone made as a gist on github that does the whole process for you and is awesome. Just use this. It saved me a lot of headache of having to keep screwing around with virtualbox. This is tested as of Docker 1.3.0 on my Mac running Yosemite.

EDIT:

Now that docker-machine cli has been deprecated in favor or docker-machine, here's how you can do it with docker-machine:

First, ssh into the docker-machine vm and create the folder we'll be mapping to:

docker-machine ssh $MACHINE_NAME "sudo mkdir -p \"$VOL_DIR\""

Now share the folder to VirtualBox:

WORKDIR=$(basename "$VOL_DIR")
vboxmanage sharedfolder add "$MACHINE_NAME" --name "$WORKDIR" --hostpath "$VOL_DIR" --transient

Finally, ssh into the docker-machine again and mount the folder we just shared:

docker-machine ssh $MACHINE_NAME "sudo mount -t vboxsf -o uid=\"$U\",gid=\"$G\" \"$WORKDIR\" \"$VOL_DIR\""

Note: for UID and GID you can basically use whatever integers as long as they're not already taken.

This is tested as of docker-machine 0.4.1 and docker 1.8.3 on OS X El Capitan.

Eli
  • 36,793
  • 40
  • 144
  • 207