我想更新一些容器。为了测试,我想创建相应卷的副本。为这个新卷设置一个新容器。
这个操作就像执行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"
/var/lib/docker/volumes/
中,因此您只需将源卷的内容复制到另一个名称的目录中即可:# -a to preserve all file attributes (permissions, ownership, etc)
sudo cp -a /var/lib/docker/volumes/source_volume /var/lib/docker/volumes/target_volume
-a
标志还是-p
?@KungFuPanda - Yusuf-rp
,但是-a
更好。 - anemytecp
命令中的 -a
选项与 -pPR
选项相同。它保留文件的结构和属性,但不保留目录结构。
因此,-a
包括 -p
选项。但是我不理解 but not directory structure
这部分的含义。 - Yusuf-a
应该保留所有内容:链接、所有权、权限、目录和结构。至少,这是我的cp(GNU coreutils)9.3版本的做法。 - anemyte如果您希望复制由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卷的唯一方法。
tar -czvf volume-archive.tar.gz -C /var/lib/docker/volumes/<volume_name>/_data .
- ABika在我的工作中,我使用this script来:
然而,该脚本对于卷的命名做出了一些假设,请在应用之前阅读README说明。