我正在考虑使用Docker在持续集成(CI)服务器上构建依赖关系,这样我就不必在代理本身上安装所有运行时和库。
为了实现这一点,我需要将容器内部构建的构建工件复制回主机。这可能吗?
我正在考虑使用Docker在持续集成(CI)服务器上构建依赖关系,这样我就不必在代理本身上安装所有运行时和库。
为了实现这一点,我需要将容器内部构建的构建工件复制回主机。这可能吗?
当前回答
装载一个“卷”并将工件复制到其中:
mkdir artifacts
docker run -i -v ${PWD}/artifacts:/artifacts ubuntu:14.04 sh << COMMANDS
# ... build software here ...
cp <artifact> /artifacts
# ... copy more artifacts into `/artifacts` ...
COMMANDS
然后,当构建完成并且容器不再运行时,它已经将构建中的工件复制到主机上的工件目录中。
Edit
注意:当您这样做时,可能会遇到docker用户的用户id与当前运行用户的用户id匹配的问题。也就是说,/fartifacts中的文件将显示为用户所有,用户的UID在docker容器中使用。解决此问题的一种方法可能是使用主叫用户的UID:
docker run -i -v ${PWD}:/working_dir -w /working_dir -u $(id -u) \
ubuntu:14.04 sh << COMMANDS
# Since $(id -u) owns /working_dir, you should be okay running commands here
# and having them work. Then copy stuff into /working_dir/artifacts .
COMMANDS
其他回答
对于任何试图使用MySQL容器并在您的计算机上本地存储卷的人来说。我使用了这个问题的顶级回复中提供的语法。但必须使用MySQL特有的特定路径
docker cp imageIdHere:/var/lib/mysql pathToYourLocalMachineHere
docker cp[选项]SRC_PATH容器:DEST_PATH
DEST_PATH必须预先存在
大多数答案并没有表明容器必须在docker cp工作之前运行:
docker build -t IMAGE_TAG .
docker run -d IMAGE_TAG
CONTAINER_ID=$(docker ps -alq)
# If you do not know the exact file name, you'll need to run "ls"
# FILE=$(docker exec CONTAINER_ID sh -c "ls /path/*.zip")
docker cp $CONTAINER_ID:/path/to/file .
docker stop $CONTAINER_ID
我为任何使用Docker for Mac的人发布这个。这就是对我有用的:
$ mkdir mybackup # local directory on Mac
$ docker run --rm --volumes-from <containerid> \
-v `pwd`/mybackup:/backup \
busybox \
cp /data/mydata.txt /backup
注意,当我使用-v装载时,会自动创建备份目录。
我希望有一天这对某人有用
如果您没有正在运行的容器,只有一个图像,并且假设您只想复制一个文本文件,可以执行以下操作:
docker run the-image cat path/to/container/file.txt > path/to/host/file.txt