Today I started writing up a backupninja container for work. This container needs to be able to:

  • Login into some of our prod boxes
  • Store backup data on an NFS share

The logical choice for handling the back-end was to use autofs because of its ability to handle mounts that may drop out for whatever reason, and since we really need our storage available, doing a plain mount is just not going to cut it.

So in my dockerfile, apt-get install autofs

Additionally, autofs actually runs automounter in daemon mode. Since I’m using supervisor as my init, that needed to change:

BROWSE_MODE="no" /usr/sbin/automount -t 0 -f /etc/auto.master

This command runs with the same parameters as a basic autofs install on ubuntu (as defined by vars /etc/default/autofs), with one exception, -t. I don’t think a lot of people know this but autofs actually:

  • Mounts the storage when you enter/ask for the storage/mountpoint
  • Actually unmounts after a specified period of time, defined by the -t (or TIMEOUT variable)

Keeping that in mind, setting -t 0 disables unmounting. I like this as it decreases the time to mount when wanting to reuse the share at a later time. This kind of thing is useful in a fairly stable environment and especially nice when browsing to your mounts via a GUI.

With that out of the way, there is one more requirement before automounter will actually run correctly: loading the kernel module, autofs4 Unfortunately, this is not possible inside a docker container, yes, even a privileged one. I won’t get into why, but will say that:

  • On ubuntu 14 systems, you’ll have to run a modprobe autofs4 on the host before autofs in your container will work. Note that you do not need autofs installed on the host to do this.
  • On coreos systems, autofs4 is already loaded, presumably because of systemd automount
  • On all systems, you will need to run your container in --privileged mode!!! If you don’t, you’ll see the likes of:

    /usr/sbin/automount: test mount forbidden or incorrect kernel protocol version, kernel protocol version 5.00 or above required.

Finally, I wanted to make note of how I handle defining my mounts to autofs. As you might know, the /etc/auto.master file defines locations and associated files that define how to mount to those locations. For my purposes, I decided to just define a single file that lists the mount points I want autofs to handle:

## Setting up our autofs mount(s)
RUN echo "/- /etc/auto.mounts" >> /etc/auto.master
ADD auto.mounts /etc/auto.mounts

In our auto.mounts, we merely define each mount, one per line:

/mnt -fstype=nfs,nolock,rw,bg,soft,intr,timeo=5,retrans=5,actimeo=10,retry=5
/house -fstype=nfs,rw,bg,soft,intr,timeo=5,retrans=5,actimeo=10,retry=5 goliath:/mnt

For more information on setting up autofs, check out the ubuntu docs.

Mario Loria is a builder of diverse infrastructure with modern workloads on both bare-metal and cloud platforms. He's traversed roles in system administration, network engineering, and DevOps. You can learn more about him here.