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

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


当前回答

要将文件从容器复制到主机,可以使用以下命令

docker cp <containerId>:/file/path/within/container /host/path/target

下面是一个示例:

$ sudo docker cp goofy_roentgen:/out_read.jpg .

这里,高飞_伦琴是我从以下命令中获得的容器名称:

$ sudo docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                            NAMES
1b4ad9311e93        bamos/openface      "/bin/bash"         33 minutes ago      Up 33 minutes       0.0.0.0:8000->8000/tcp, 0.0.0.0:9000->9000/tcp   goofy_roentgen

您还可以使用(部分)容器ID。以下命令相当于第一个

$ sudo docker cp 1b4a:/out_read.jpg .

其他回答

如果您只想装载一个文件夹,而不是为容器创建特殊存储,则可以使用bind而不是volume:

使用标签构建图像:码头建造-t<图像>运行映像并绑定app.py存储的当前$(pwd)目录,并将其映射到容器内的/root/example/。docker run--mount type=bind,source=“$(pwd)”,target=/root/example/<image>python app.py

docker cp[选项]SRC_PATH容器:DEST_PATH

DEST_PATH必须预先存在

从DockerContainer到LocalMachine

$docker cp containerId:/sourceFilePath/someFile.txt C:/localMachineDestinationFolder

从LocalMachine到DockerContainer

$docker cp C:/localMachineSourceFolder/someFile.txt containerId:/containerDestinationFolder

我将PowerShell(Admin)与此命令一起使用。

docker cp {container id}:{container path}/error.html  C:\\error.html

实例

docker cp ff3a6608467d:/var/www/app/error.html  C:\\error.html

如果您使用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