【发布时间】:2021-08-06 14:45:36
【问题描述】:
我想更新一些容器。为了测试,我想创建相应卷的副本。为这个新卷设置一个新容器。
这和cp -r volumeOld volumeNew 一样简单吗?
或者我需要注意什么?
【问题讨论】:
我想更新一些容器。为了测试,我想创建相应卷的副本。为这个新卷设置一个新容器。
这和cp -r volumeOld volumeNew 一样简单吗?
或者我需要注意什么?
【问题讨论】:
要克隆 docker 卷,您可以将文件从一个卷传输到另一个卷。为此,您必须手动创建一个新卷,然后启动一个容器来复制内容。
有人已经为此编写了一个脚本,您可以使用它:https://github.com/gdiepen/docker-convenience-scripts/blob/master/docker_clone_volume.sh
如果没有,请使用以下命令(取自脚本):
# 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"
【讨论】:
在 Linux 上,它可以像复制目录一样简单。 Docker 将卷保存在 /var/lib/docker/volumes/<volume_name> 中,因此您可以简单地将源卷的内容复制到另一个名称的目录中:
# -p to preserve permissions
sudo cp -rp /var/lib/docker/volumes/source_volume /var/lib/docker/volumes/target_volume
【讨论】:
如果您要复制由 docker-compose 管理的卷,您还需要在创建新卷时复制特定的标签。
否则 docker-compose 会抛出类似Volume already exists but was not created by Docker Compose 的东西。
通过MauriceNino 扩展解决方案,这些行对我有用:
# 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"
顺便说一句,这似乎也是重命名 Docker 卷的唯一方法。
【讨论】: