在Docker中将数据添加到现有命名卷的正确方法是什么?
我以前使用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 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 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/