我的问题是关于文件从容器复制到主机的问题;我有一个Dockerfile,从源代码获取依赖项,编译构建工件,并运行可执行文件。我还想复制构建工件(在我的情况下,它是由sbt dist在……/target/ ',但我认为这个问题也适用于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。想法吗?
我在MacOS上使用boot2docker。我可以向你保证,基于“docker cp”的脚本是可移植的。因为任何命令都是在boot2docker内部传递的,但随后二进制流被中继回运行在mac上的docker命令行客户端。因此,来自docker客户端的写操作在服务器内部执行,并写回正在执行的客户端实例!
我与我提供的任何docker容器共享docker卷的备份脚本,我的备份脚本在linux和MacOS上使用boot2docker进行了测试。备份可以在平台之间轻松交换。基本上,我在脚本中执行以下命令:
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容器的卷。整个卷被写入备份文件“backups/JenkinsBackup-2015-07-09-14-26-15.tar”
我已经在linux容器和mac容器之间移动了存档,而没有对备份或恢复脚本进行任何调整。如果这是你想要的,你可以在这里找到整个脚本教程:blacklabelops/jenkins
第一个使用docker pull的docker映像
docker pull <IMG>:<TAG>
然后使用docker create命令创建一个容器,并将容器id存储为一个变量
img_id=$(docker create <IMG>:<TAG>)
现在,运行docker cp命令将docker容器中的文件夹和文件复制到主机上
docker cp $img_id:/path/in/container /path/in/host
一旦文件/文件夹被移动,使用docker rm删除容器
docker rm -v $img_id