在Docker中将数据添加到现有命名卷的正确方法是什么?

在Docker中将数据添加到现有命名卷的正确方法是什么?,docker,Docker,我以前使用Docker时使用的是卷容器: docker run -d --name jenkins-data jenkins:tag echo "data-only container for Jenkins" 但现在我改为创建命名卷的新方法: docker volume create --name my-jenkins-volume 我把这本新书装订到一个新的詹金斯容器上。 我只剩下一个文件夹,里面有我以前的jenkins容器的/var/jenkins_home。(使用docker c

我以前使用Docker时使用的是卷容器:

docker run -d --name jenkins-data jenkins:tag echo "data-only container for Jenkins"
但现在我改为创建命名卷的新方法:

 docker volume create --name my-jenkins-volume 
我把这本新书装订到一个新的詹金斯容器上。 我只剩下一个文件夹,里面有我以前的jenkins容器的
/var/jenkins_home
。(使用
docker cp
) 现在,我想用该文件夹的内容填充新命名的卷

我是否可以将该文件夹的内容复制到
/var/lib/jenkins/volume/my jenkins volume/\u data

您当然可以将数据直接复制到
/var/lib/docker/volumes/my jenkins volume/\u data
,但这样做您就是:

  • 依赖于对docker主机的物理访问。如果您与远程docker api交互,此技术将不起作用

  • 依赖于卷实现的某个特定方面在将来可能会发生变化,打破任何依赖它的流程

我认为您最好依靠通过命令行客户端使用docker api来完成的事情。最简单的解决方案可能只是使用助手容器,例如:

docker run -v my-jenkins-volume:/data --name helper busybox true
docker cp . helper:/data
docker rm helper

您可以使用,例如,将接受的答案减少为一行

docker run --rm -v `pwd`:/src -v my-jenkins-volume:/data busybox cp -r /src /data

无需启动某些容器即可将数据添加到已存在的命名卷,只需创建一个容器并将数据复制到其中:

docker container create --name temp -v my-jenkins-volume:/data busybox
docker cp . temp:/data
docker rm temp

以下是将~/data的内容复制到名为my vol

第一步。将卷附加到“临时”容器。对于在终端中运行的命令:

docker-run--rm-it--name-alpine--mount-type=volume,source=my-vol,target=/data-alpine

第二步。将~/data的内容复制到my vol中。对于在“新建终端”窗口中运行此命令的用户:

cd~/data
docker cp。阿尔卑斯山:/data


这将把~/data的内容复制到my vol卷中。复制后退出临时容器。

如果您不想创建docker,并且可以作为特权用户访问,只需执行以下操作(在Linux系统上):


此外,它还允许您在docker运行时访问数据,或者在docker容器停止时访问数据。

关于第二个项目符号,您可以运行
docker volume inspect my jenkins volume——格式化“{.Mountpoint}}”
以编程方式获取其物理位置。但这仍然不是一个好主意。这个助手容器永远不需要实际运行。只需创建它,然后运行
docker cp
,然后删除它就足够了。您无法在该容器中执行以查看结果或手动修改文件。请注意,使用时列出
/var/lib/docker/volumes/my jenkins volume/_data
不起作用,因为文件存储在容器中。这里解释了See True,我想知道/tmp的瞬态特性是否会造成容器可能在cp完成之前删除您的数据的风险?该链接并没有真正阐明/tmp中文件的生存期。我声明:“程序不能假定/tmp中的任何文件或目录在程序调用之间都被保留。”这意味着这些文件将继续存在,但这是一种保证。如果不存在,docker的-v选项将在容器中创建一个目录,因此如果您担心这种潜在的争用情况,那么将/tmp/src更改为/src将起作用。我将编辑答案以反映这一点,因为没有缺点。
-v`pwd`:/src
是否意味着命令正在主机上运行?(例如,如果主机是另一台机器,主机如何映射
pwd
?--它不能。)如果docker命令未在主机上运行,则此操作不起作用。我相信这就是为什么我们有docker cp。这似乎不是docker的“方式”——它只是一个特例,只有在主机上运行docker命令时才有效。我理解正确吗?是的,我想你是对的
pwd
必须解析为主机上的文件。docker的挂载文档中写道:“在绑定挂载的情况下,第一个字段是主机上文件或目录的路径。”因此,如果在远程主机中,这无法将本地文件复制到容器中,因为您正在挂载的
pwd
甚至不需要存在于远程主机中。相反,由Dmytro Melnychuk(create+cp+rm)提供的解决方案会将本地内容复制到容器中,而不管它在哪里运行;您可以使用
hello world
实现这一点,它也可以工作<代码>总线箱为1.22MB。相反,
hello world
为13.3kB。问题是:就像我们可以从头开始创建docker文件一样,我们是否可以创建一个“docker容器创建”,图像中没有“任何内容”,因为我们只想“装载”卷,而不启动容器?+1对于这个解决方案,在顶部投票,但是
docker cp
的正确语法是
docker cp[选项]CONTAINER:SRC_PATH DEST_PATH
@MarcoDufal这是其中一个语法,但也是
docker cp[OPTIONS]SRC_PATH.-CONTAINER:DEST_PATH
docker volume create my_named_volume
sudo cp -p . /var/lib/docker/volumes/my_named_volume/_data/