docker工人 – 如何将文件从图像复制到主机?

我的问题是关于将文件从容器复制到主机的问题。 我有一个Dockerfile提取依赖关系,从源编译构build工件,并运行一个可执行文件。 我也想复制构build工件(在我的情况下,它是由sbt dist生成的.zip ,但我认为这个问题也适用于jar,二进制文件等)。

docker cp在容器上工作,而不是图像; 我是否需要启动一个容器才能从中取出文件? 在一个脚本中,我试图在后台以交互模式运行/bin/bash ,将文件复制出来,然后杀死容器,但这似乎很糟糕。 有没有更好的办法?

另一方面,我想避免在运行docker save $IMAGENAME只是为了得到一个文件(但似乎是最简单的,如果最慢的选项现在)解压.tar文件。

我会使用docker卷,例如:

 docker run -v hostdir:out $IMAGENAME /bin/cp/../blah.zip /out 

但我在OSX中运行boot2docker ,我不知道如何直接写入我的mac主机文件系统(读写卷挂载在我的boot2docker虚拟机,这意味着我不能轻松共享一个脚本来提取blah.zip从一个人的形象。想法?

回答一个老问题的参考。 要从图像中复制文件,请创build一个临时容器,从中复制文件,然后将其删除:

 id=$(docker create image-name) docker cp $id:path - > local-tar-file docker rm -v $id 

不幸的是,似乎没有办法直接从Docker镜像复制文件。 您需要先创build容器,然后从容器中复制文件。

但是,如果您的映像包含cat命令(并且在很多情况下会执行此命令),则可以使用单个命令执行此操作:

 docker run --rm --entrypoint cat yourimage /path/to/file > path/to/destination 

如果你的图像不包含cat ,只需创build一个容器,并按照伊戈尔的回答build议使用docker cp命令。

家长评论已经显示如何使用 。 你也可以用类似的方式使用tar

docker run yourimage tar -c -C /my/directory subfolder | tar x

我在MacOS上使用boot2docker。 我可以向你保证,基于“docker cp”的脚本是可移植的。 因为任何命令在boot2docker中被中继,但是二进制stream被中继回到在mac上运行的docker命令行客户端。 所以,docker客户端的写操作在服务器端被执行,并被写回执行的客户端实例!

我正在使用我提供的任何docker容器共享docker卷的备份脚本,并且我的备份脚本在boot和boot2docker上都在Linux和MacOS上进行了testing。 备份可以在平台之间轻松交换。 基本上我在我的脚本中执行以下命令:

 docker run --name=bckp_for_volume --rm --volumes-from jenkins_jenkins_1 -v /Users/github/jenkins/backups:/backup busybox tar cf /backup/JenkinsBackup-2015-07-09-14-26-15.tar /jenkins 

运行一个新的busybox容器,并安装jenkins_jenkins_1名称的jenkins容器的容量。 整个卷被写入文件备份/ JenkinsBackup-2015-07-09-14-26-15.tar

我已经移动了在Linux容器和我的Mac容器之间的档案,没有任何调整备份或恢复脚本。 如果这是你想要的,你可以在这里find整个脚本的教程: blacklabelops / jenkins

docker cp允许您将映像中的文件复制回主机。

文档可以在这里find: https : //docs.docker.com/reference/commandline/cli/#cp