Docker volumes are great for storing persistent data in one spot. Sometimes,
though, you need to get a volume from one place to another — something that isn’t obvious how to do.

While Docker images are easily shipped around as tar archives via docker save and docker load, there aren’t yet commands for volumes to do the same thing.

Fortunately, since volumes can be mounted into any container we like, getting data out is a simple matter of running a tar command in a throwaway container. Just make sure that any containers that might be using those volumes are shut down first!

# Export to stdout
docker run --rm -v $VOLUME:/data -w /data alpine tar czf - ./
# Import from stdin
docker run --rm -i -v $VOLUME:/data -w /data alpine tar xzf -

Using the above commands, you can stream volumes to wherever you might need them.

# Backup to S3
docker run --rm -v $VOLUME:/data -w /data alpine tar czf - ./ \
  | aws s3 cp - s3://mybucket/$VOLUME-`date +%s`.tar.gz

# Restore from a local file
docker run --rm -i -v $VOLUME:/data -w /data alpine tar xzf - \
  < myvolume.tar.gz

# Transfer over SSH
# (If bandwidth is not a concern, remove the "z" from both tar commands to
# disable compression and potentially speed up the transfer.)
docker run --rm -v $VOLUME:/data -w /data alpine tar czf - ./ \
  | ssh \
    "docker run --rm -i -v $VOLUME:/data -w /data alpine tar xzf -"