Skip Navigation

Options in backing up persistent docker volumes?

Hi all

I'm running several docker containers with local persistent volumes that I would like to backup. I haven't found an easy method to do so.

What do you use / recommend to do that? AFAIK you can't just rsync the volume directory while the container is running.

4 comments
  • Use bind mounts instead of docker volumes. Then you just have normal directories to back up, the same as you would anything else.

    In general, it's not a problem to back up files while the container is running. The exception to this is databases. To have reliable database backups, you need to stop the container (or quiesce/pause the database if it supports it) before backing up the raw database files (including SQLite).

    • This is your answer. It also has the benefit of allowing you to have a nice folder structure for your Docker setup, where you have a folder for each service holding the corresponding compose yaml and data folder(s)

  • Rsync works fine for most data. (I use borgbackup) For any database data, create a dump using pg_dump or mysqldump or whatever. Then backup the dump and all other volumes but exclude the db volume.

  • Bind mounts are easy to maintain and backup. However if you share data amongst multiple container docker volumes are recommend especially for managing state.

    Backup volumes:

    docker run --rm --volumes-from dbstore -v $(pwd):/backup containername tar cvf /backup/backup.tar /dbdata

    • Launch a new container and mount the volume from the dbstore container
    • Mount a local host directory as /backup
    • Pass a command that tars the contents of the dbdata volume to a backup.tar file inside /backup directory.

    docker docs - volumes

    Database volume backup without stopping the service: bash into the container, dump it, and copy it out with docker cp. Run it periodically via crontab