Run on an External Volume

In order to leverage cloud-provider facilities like attachable volumes, (a.k.a. block storage) the following is an easy tutorial to achieve Dokku runs on them.

Warning

If the block storage is not available and attached on boot it is possible that containers will not correctly start. Please keep this in mind when considering moving Dokku and/or Docker to network attached storage.

The following is intended to be executed on the dokku host machine as root. Say, for instance, that our volume is mapped into the systems as /dev/vdb1.

Stop docker daemon

systemctl stop docker.socket
systemctl stop docker

Prepare the filesystem:

mkfs -t ext4 /dev/vdb1
mkdir /mnt/volume
mount /dev/vdb1 /mnt/volume

Move the old data directories:

mv /home/dokku /home/dokku.OLD
mv /var/lib/docker /var/lib/docker.OLD
mv /var/lib/dokku /var/lib/dokku.OLD

Move the data on the volume

mkdir /mnt/volume/home/
mkdir -p /mnt/volume/var/lib/
mv /home/dokku.OLD /mnt/volume/home/dokku
mv /var/lib/dokku.OLD /mnt/volume/var/lib/dokku
mv /var/lib/docker.OLD /mnt/volume/var/lib/docker

Prepare the mountpoints

mkdir /home/dokku
mkdir /var/lib/dokku
mkdir /var/lib/docker
chown dokku:dokku /home/dokku   # respect the original ownership
chmod 711 /var/lib/docker       # respect the original permissions

Mount bind

mount -o bind /mnt/volume/home/dokku /home/dokku
mount -o bind /mnt/volume/var/lib/dokku /var/lib/dokku
mount -o bind /mnt/volume/var/lib/docker /var/lib/docker

Start docker daemon

systemctl start docker.socket
systemctl start docker

At this point all should be working fine, please check it out.

Then, let the changes be reboot-persistent

echo '/dev/vdb1 /mnt/volume ext4 defaults 0 2' | sudo tee -a /etc/fstab
echo '/mnt/volume/home/dokku /home/dokku none defaults,bind 0 0' | sudo tee -a /etc/fstab
echo '/mnt/volume/var/lib/dokku /var/lib/dokku none defaults,bind 0 0' | sudo tee -a /etc/fstab
echo '/mnt/volume/var/lib/docker /var/lib/docker none defaults,bind 0 0' | sudo tee -a /etc/fstab