'Copy docker volumes

I want to update some container. For testing, I want to create a copy of the corresponding volume. Set up a new container for this new volume.

Is this as easy as doing cp -r volumeOld volumeNew?

Or do I have to pay attention to something?



Solution 1:[1]

To clone docker volumes, you can transfer your files from one volume to another one. For that you have to manually create a new volume and then spin up a container to copy the contents.

Someone has already made a script for that, which you might use: https://github.com/gdiepen/docker-convenience-scripts/blob/master/docker_clone_volume.sh

If not, use the following commands (taken from the script):

# Supplement "old_volume" and "new_volume" for your real volume names

docker volume create --name new_volume

docker container run --rm -it \
           -v old_volume:/from \
           -v new_volume:/to \
           alpine ash -c "cd /from ; cp -av . /to"

Solution 2:[2]

On Linux it can be as easy as copying a directory. Docker keeps volumes in /var/lib/docker/volumes/<volume_name>, so you can simply copy contents of the source volume into a directory with another name:

# -p to preserve permissions
sudo cp -rp /var/lib/docker/volumes/source_volume /var/lib/docker/volumes/target_volume

Solution 3:[3]

Should you want to copy volumes managed by docker-compose, you'll also need to copy the specific labels when creating the new volume. Else docker-compose will throw something like Volume already exists but was not created by Docker Compose.

Extending on the solution by MauriceNino, these lines worked for me:

# Supplement "proj1_vol1" and "proj2_vol2" for your real volume names

docker volume inspect proj1_vol1  # Look at labels of old volume

docker volume create \
           --label com.docker.compose.project=proj2 \
           --label com.docker.compose.version=2.2.1 \
           --label com.docker.compose.volume=vol2 \
           proj2_vol2

docker container run --rm -it \
           -v proj1_vol1:/from \
           -v proj2_vol2:/to \
           alpine ash -c "cd /from ; cp -av . /to"

Btw, this also seems to be the only way to rename Docker volumes.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2
Solution 3 Peter Rullmann