我正在运行Jenkins声明性管道,其中一个阶段在docker容器上运行并输出文件。我想将此文件从容器复制到主机的git init路径,以便将新输出的文件提交到源git存储库。
为了将输出的文件从容器复制到主机的git init路径,我可以使用docker cp命令来获取容器ID和目标路径,在这种情况下,目标路径就是主机的git初始路径。
有人可以分享有关如何获得这两个值的想法吗?
答案 0 :(得分:1)
通常,您不会做任何事情。 Docker是一个隔离系统,旨在从容器中隐藏主机系统的大多数细节(反之亦然)。容器文件系统也往往不会以易于提取的方式存储在主机上。
在Using Docker with Pipeline时,它知道如何将当前的工作树挂载到容器中,因此最简单的方法是
stage('Something') {
agent {
docker { image 'my-image' }
}
steps {
sh 'the_command'
}
}
或者,如果您使用的是脚本管道
docker.image('my-image').inside {
sh 'the_command'
}
在这两种情况下,the_command
都将以其当前工作目录(即每个构建工作空间目录)运行;它不需要知道它在Docker内部运行,也不需要知道有关主机的任何信息,它写入此目录的任何更改都可以在您的构建中的其他位置看到。
更广泛地说,如果希望容器内的进程产生在主机上可见的文件,则需要在运行容器时使用docker run -v
选项mount a host directory进入容器。 (在前面的示例中,Jenkins日志将包含显示这些选项的详细docker run
命令。)如果应用程序的主要目标是生成主机可见文件,则在Docker外部运行它可能会更容易。如果Jenkins也在Docker内部运行,请注意docker run -v
的第一个路径选项始终是物理主机上的路径,并且无法将一个容器的文件系统映射到另一个容器。
答案 1 :(得分:0)
您可以通过以下cmd获取容器内部的docker容器ID:
cat /proc/self/cgroup | grep -o -e "docker-.*.scope" | head -n 1 | sed "s/docker-\(.*\).scope/\\1/"