复制Docker卷。

34

我想更新一些容器。为了测试,我想创建相应卷的副本。为这个新卷设置一个新容器。

这个操作就像执行cp -r volumeOld volumeNew那么简单吗?

还是需要注意什么吗?

5个回答

38

要克隆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"

6
小心。alpine的cp(busybox)不保留硬链接(即使使用-a选项)。使用上述脚本/片段不会产生相同的卷(当我克隆infludb数据卷时,我以艰难的方式发现了这一点)。改用Ubuntu可以解决这个问题:请参见https://github.com/harmv/docker-convenience-scripts/blob/master/docker_clone_volume.sh - harmv

35
在Linux上,它可以像复制一个目录那样简单。Docker将卷保存在/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

3
这真的起作用了! 我最初是以root用户的身份进行复制,但没有使用-p选项,一些容器失败了。 我重新使用了-p选项,一切都正常工作了!谢谢。 - KungFuPanda
你是指答案中提到的-a标志还是-p?@KungFuPanda - Yusuf
1
@Yusuf,答案原本提到了-rp,但是-a更好。 - anemyte
@anemyte cp 命令中的 -a 选项与 -pPR 选项相同。它保留文件的结构和属性,但不保留目录结构。 因此,-a 包括 -p 选项。但是我不理解 but not directory structure 这部分的含义。 - Yusuf
我想使用这种方法来备份Docker卷,这样我就可以在同一台机器上的不同位置使用这个命令,但在将其从那个位置恢复到新的Docker卷时,它仍然会保留所有权限等,对吗?@anemyte - Yusuf
1
@Yusuf -a应该保留所有内容:链接、所有权、权限、目录和结构。至少,这是我的cp(GNU coreutils)9.3版本的做法。 - anemyte

7

如果您希望复制由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卷的唯一方法。


4

要创建一个可以使用此Docker扩展导入的存档文件,请执行以下命令:tar -czvf volume-archive.tar.gz -C /var/lib/docker/volumes/<volume_name>/_data . - ABika

0

在我的工作中,我使用this script来:

  • 克隆容器
  • 克隆所有卷并将旧卷的内容复制到新卷中
  • 运行新容器(使用任意新镜像)
  • 将新卷重新附加到新容器中,目标与旧卷相同

然而,该脚本对于卷的命名做出了一些假设,请在应用之前阅读README说明。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接