我正在运行一个Jenkins声明性管道,其中一个阶段运行在一个码头容器上,并输出一个文件。我希望将这个文件从容器复制到主机的git init路径,以便将新输出的文件提交到源git存储库。
为了将输出的文件从容器复制到主机的git init路径,我可以使用docker cp命令(为此需要容器ID )和目标路径(在本例中是主机的git init路径)。
有人能分享如何得到这两个值的想法吗?
发布于 2019-12-19 03:26:19
通常你不会做这两件事。Docker是一个隔离系统,其目的是向容器隐藏主机系统的大部分细节(反之亦然);此外,容器文件系统往往不会以易于提取的方式存储在主机上。
当您是码头与管道结合使用时,它知道如何将当前的工作树挂载到容器中,所以最简单的方法是
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
选项将其放入容器中。(在前面的示例中,Jenkins日志将包含一个显示这些选项的详细docker run
命令。)如果应用程序的主要目标是生成主机可见的文件,那么在Docker之外运行它可能会更容易。如果Jenkins也在Docker中运行,请注意,docker run -v
的第一个路径选项总是物理主机上的路径,因此无法将一个容器的文件系统映射到另一个容器中。
发布于 2019-12-19 00:33:36
您可以通过此cmd获取容器内的停靠容器ID:
cat /proc/self/cgroup | grep -o -e "docker-.*.scope" | head -n 1 | sed "s/docker-\(.*\).scope/\\1/"
https://stackoverflow.com/questions/59403140
复制相似问题