我正在考虑使用Docker在持续集成(CI)服务器上构建依赖关系,这样我就不必在代理本身上安装所有运行时和库。

为了实现这一点,我需要将容器内部构建的构建工件复制回主机。这可能吗?


当前回答

如果您使用podman/buildah1,它为将文件从容器复制到主机提供了更大的灵活性,因为它允许您装载容器。

创建容器后,如以下回答所示

podman create --name dummy IMAGE_NAME

现在,我们可以装载整个容器,然后使用几乎每个linux盒子中的cp实用程序将/etc/foobar的内容从容器(虚拟)复制到主机上的/tmp中。所有这些都可以无根地完成。观察:

$ podman unshare -- bash -c '
  mnt=$(podman mount dummy)
  cp -R ${mnt}/etc/foobar /tmp
  podman umount dummy
'

1.podman在内部使用buildah,它们也共享几乎相同的api

其他回答

在主机系统(容器外部)上创建一个数据目录,并将其装载到容器内部可见的目录中。这将文件放置在主机系统上的已知位置,并使主机系统中的工具和应用程序可以轻松访问文件

docker run -d -v /path/to/Local_host_dir:/path/to/docker_dir docker_image:tag

对于任何试图使用MySQL容器并在您的计算机上本地存储卷的人来说。我使用了这个问题的顶级回复中提供的语法。但必须使用MySQL特有的特定路径

docker cp imageIdHere:/var/lib/mysql pathToYourLocalMachineHere

装载一个“卷”并将工件复制到其中:

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
docker run -dit --rm IMAGE
docker cp CONTAINER:SRC_PATH DEST_PATH

https://docs.docker.com/engine/reference/commandline/run/https://docs.docker.com/engine/reference/commandline/cp/

我为任何使用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装载时,会自动创建备份目录。

我希望有一天这对某人有用