复制Docker卷

k97glaaz  于 2022-12-03  发布在  Docker
关注(0)|答案(4)|浏览(175)

我想更新一些容器。为了测试,我想创建相应卷的副本。为此新卷设置一个新容器。
这和cp -r volumeOld volumeNew一样简单吗?
还是我得注意点什么?

igsr9ssn

igsr9ssn1#

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

azpvetkf2#

在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
wwwo4jvm

wwwo4jvm3#

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

neekobn8

neekobn84#

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

  • 克隆容器
  • 克隆其所有卷并将内容从旧卷复制到新卷
  • 运行新容器(带有任意新图像)
  • 将新卷重新挂接到与旧卷相同目标的新容器

但是,该脚本对卷的命名做了一些假设,因此请在应用该脚本之前阅读自述文件说明。

相关问题