Docker: Persisting User Data

I’m busy putting together a Docker image for a multi-user Jupyter Notebook installation. I am to have an independent login for each of the users and each of them should also have their own storage space. That space should exist elsewhere from on the container though, so that even if the container stops, the data lives on. This should mitigate user rage.

The Docker logo.

There are number of options for achieving this but I’m simply going to persist the data onto the Docker host.

Adding a Volume

On the host machine you could create a new folder to hold the user content. However, it makes sense to just use /home/. Start your docker container with the -v option which binds a location on the host to a location on the container.

docker run -d -p 80:8000 -v /home/:/home jupyter:latest

Adding Users

Now make a shell connection to the container.

docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
d6a5ca03a212        jupyter:latest      "jupyterhub"        2 minutes ago       Up 2 minutes        0.0.0.0:80->8000/tcp   frosty_ride
docker exec -t -i d6a5ca03a212 /bin/bash

We’ll be using the mkpasswd command to generate encrypted passwords, so we need to install the whois package.

apt-get update && apt-get install -y whois

Now you can create users.

useradd jupyter -m -p `mkpasswd jupyter` -s /bin/bash

It’s critical that the argument to the -p flag is generated by mkpasswd, otherwise logging in as this user won’t work!

That will create a jupyter folder under /home/ on the container.

ls /home
jupyter

It will also add an entry to /etc/passwd.

grep "jupyter" /etc/passwd
jupyter:x:1000:1000::/home/jupyter:/bin/bash

If we now exit the shell connection and check the /home/ folder on the host we’ll find that it is where the home folder for the jupyter user is located.

ls /docker-home/
jupyter

Done!