Skip to content

Instantly share code, notes, and snippets.

@mnylen
Forked from mattes/Dockerfile.tmpl
Created July 5, 2014 05:01
Show Gist options
  • Save mnylen/edef5804fe8e8fda1f81 to your computer and use it in GitHub Desktop.
Save mnylen/edef5804fe8e8fda1f81 to your computer and use it in GitHub Desktop.

Build boot2docker.iso with VirtualBox Guest Additions

Allows me to mount /Users into boot2docker which is incredibly useful for my local Docker environment under Mac OSX. So from Mac I can do sth like this:
docker run -v /Users/mattes/somedir:/data/somedir [..].

This Dockerfile will download the latest boot2docker image (see FROM boot2docker/boot2docker) and adds VirtualBox Guest Additions for your running VirtualBox version.

See also boot2docker/boot2docker#284.

I tried to make the mount permanent from within the VirtualBox GUI (see screenshot) but that didn't work. So I added the mount logic to $ROOTFS/etc/rc.d/vbox-guest-additions-permanent-mount (see Dockerfile.tmpl)

See build log here https://gist.github.com/mattes/6bed15318e93925b1280

# generate Dockerfile from Dockerfile.tmpl
chmod +x build_docker.sh
./build_docker.sh

# build the actual boot2docker.iso with virtual box guest additions
docker build -t mattes/boot2docker-vbga .

# the following line is proposed in many tutorials, but does not work for me
# (it outputs an iso that won't work)
docker run -i -t --rm mattes/boot2docker-vbga > boot2docker.iso

# so I do:
docker run -i -t --rm mattes/boot2docker-vbga /bin/bash
# then in a second shell:
docker cp <Container-ID>:boot2docker.iso boot2docker.iso

# use the new boot2docker.iso
boot2docker stop
mv ~/.boot2docker/boot2docker.iso ~/.boot2docker/boot2docker.iso.backup
mv boot2docker.iso ~/.boot2docker/boot2docker.iso
VBoxManage sharedfolder add boot2docker-vm -name home -hostpath /Users
boot2docker up
boot2docker ssh "ls /Users" # to verify if it worked
#!/usr/bin/env sh
get_vbox_version(){
local VER
VER=$(VBoxManage -v | awk -F "r" '{print $1}')
if [ -z "$VER" ]; then
echo "ERROR"
else
echo "$VER"
fi
}
write_vbox_dockerfile(){
local VER
VER=$(get_vbox_version)
if [ ! "$LATEST_RELEASE" = "ERROR" ]; then
sed "s/\$VBOX_VERSION/$VER/g" Dockerfile.tmpl > Dockerfile
else
echo "WUH WOH"
fi
}
write_vbox_dockerfile
# using VirtualBox version $VBOX_VERSION
FROM boot2docker/boot2docker
RUN apt-get install p7zip-full
RUN mkdir -p /vboxguest && \
cd /vboxguest && \
curl -L -o vboxguest.iso http://download.virtualbox.org/virtualbox/$VBOX_VERSION/VBoxGuestAdditions_$VBOX_VERSION.iso && \
7z x vboxguest.iso -ir'!VBoxLinuxAdditions.run' && \
sh VBoxLinuxAdditions.run --noexec --target . && \
mkdir x86 && cd x86 && tar xvjf ../VBoxGuestAdditions-x86.tar.bz2 && cd .. && \
mkdir amd64 && cd amd64 && tar xvjf ../VBoxGuestAdditions-amd64.tar.bz2 && cd .. && \
cd amd64/src/vboxguest-$VBOX_VERSION && KERN_DIR=/linux-kernel/ make && cd ../../.. && \
cp amd64/src/vboxguest-$VBOX_VERSION/*.ko $ROOTFS/lib/modules/$KERNEL_VERSION-tinycore64 && \
mkdir -p $ROOTFS/sbin && cp x86/lib/VBoxGuestAdditions/mount.vboxsf $ROOTFS/sbin/
RUN echo "" >> $ROOTFS/etc/motd; \
echo " boot2docker with VirtualBox guest additions version $VBOX_VERSION" >> $ROOTFS/etc/motd; \
echo "" >> $ROOTFS/etc/motd
# make mount permanent @todo it works, but its ugly. where should this go?
RUN echo '#!/bin/sh' >> $ROOTFS/etc/rc.d/vbox-guest-additions-permanent-mount; \
echo 'sudo modprobe vboxsf && sudo mkdir /Users && sudo mount -t vboxsf home /Users' >> $ROOTFS/etc/rc.d/vbox-guest-additions-permanent-mount
RUN chmod +x $ROOTFS/etc/rc.d/vbox-guest-additions-permanent-mount
RUN echo '/etc/rc.d/vbox-guest-additions-permanent-mount' >> $ROOTFS/opt/bootsync.sh
RUN depmod -a -b $ROOTFS $KERNEL_VERSION-tinycore64
RUN /make_iso.sh
CMD ["cat", "boot2docker.iso"]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment