我正在考虑使用Docker在持续集成(CI)服务器上构建依赖关系,这样我就不必在代理本身上安装所有运行时和库。
为了实现这一点,我需要将容器内部构建的构建工件复制回主机。这可能吗?
我正在考虑使用Docker在持续集成(CI)服务器上构建依赖关系,这样我就不必在代理本身上安装所有运行时和库。
为了实现这一点,我需要将容器内部构建的构建工件复制回主机。这可能吗?
当前回答
作为一个更通用的解决方案,Jenkins有一个CloudBees插件可以在Docker容器中构建。您可以从Docker注册表中选择要使用的图像,或者定义要构建和使用的Dockerfile。
它将把工作区作为一个卷装载到容器中(使用适当的用户),将其设置为工作目录,执行您请求的任何命令(在容器内)。您还可以使用docker工作流插件(如果您更喜欢代码而不是UI),使用image.inside(){}命令来完成此操作。
基本上,所有这些都要烘焙到CI/CD服务器中,然后再进行一些。
其他回答
docker cp[OPTIONS]CONTAINER:SRC_PATH DEST_PATH将从容器复制到主机。
例如docker cp测试:/opt/file1/etc/
对于Vice Versa:
docker cp[OPTIONS]SRC_PATH CONTAINER:DEST_PATH从主机复制到容器。
如果您只想从映像(而不是正在运行的容器)中提取文件,可以执行以下操作:
docker运行--rm<image>cat<source>><local_dest>
这将打开容器,写入新文件,然后删除容器。然而,一个缺点是文件权限和修改日期不会被保留。
作为一个更通用的解决方案,Jenkins有一个CloudBees插件可以在Docker容器中构建。您可以从Docker注册表中选择要使用的图像,或者定义要构建和使用的Dockerfile。
它将把工作区作为一个卷装载到容器中(使用适当的用户),将其设置为工作目录,执行您请求的任何命令(在容器内)。您还可以使用docker工作流插件(如果您更喜欢代码而不是UI),使用image.inside(){}命令来完成此操作。
基本上,所有这些都要烘焙到CI/CD服务器中,然后再进行一些。
装载卷、复制工件、调整所有者id和组id:
mkdir artifacts
docker run -i --rm -v ${PWD}/artifacts:/mnt/artifacts centos:6 /bin/bash << COMMANDS
ls -la > /mnt/artifacts/ls.txt
echo Changing owner from \$(id -u):\$(id -g) to $(id -u):$(id -g)
chown -R $(id -u):$(id -g) /mnt/artifacts
COMMANDS
编辑:请注意,某些命令(如$(id-u))是反斜杠的,因此将在容器中处理,而未反斜杠的命令将在命令发送到容器之前由主机中运行的shell处理。
docker cp containerId:source_path destination_path
containerId可以从docker ps-a命令获得
源路径应该是绝对的。例如,如果应用程序/服务目录从docker容器中的应用程序开始,则路径为/app/some_directory/file
示例:docker cp d86844abc129:/app/server/output/server-test.png C:/Users/someone/Desktop/output