Persistent storage for your Rails apps with Dokku and Docker

At Firmhouse, we're building Intercity Next. An open source hosting management panel for Ruby on Rails that hosts apps on servers of your choice. Intercity Next uses Dokku under the hood Dokku. Dokku runs apps in Docker containers.

There are a few things to think about when running apps in Docker containers. One of them is that you have no persistent file storage in between deploys. Having no persistent storage causes every app deploy to remove all user uploaded content. Say goodbye to those avatars uploaded by Paperclip or Carrierwave! Luckily, you can solve that with the docker-options feature in Dokku.

Creating a persistent directory for your app via docker-options

I want Paperclip to be able to store user uploaded content and keep it in between deploys. The default Paperclip storage directory is $RAILS_ROOT/public/system. So I want to make this directory persistent. This is how I do that:

First I create a storage directory on the host server:

ssh root@hostserver  
mkdir -p /storage/appname/public/system  

Then I tell Dokku to launch my app container with that directory from the host system mounted in my app:

dokku docker-options:add appname run "-v /storage/appname/public/system:/app/public/system  

Dokku will now use this -v option for all new deploys.

The only thing to do now refresh the currently running app containers:

dokku ps:rebuild appname  

Done! Persistent storage for your app without needing an external storage service.

Questions or comments?

If you have any questions or comments, please let me know! You can reach me on Twitter via @michiels or send me an email at michiel@firmhouse.com.