从容器内部获取Docker容器ID及其主机路径

时间:2019-12-19 04:02:34

标签: docker jenkins-pipeline

我正在运行Jenkins声明性管道,其中一个阶段在docker容器上运行并输出文件。我想将此文件从容器复制到主机的git init路径,以便将新输出的文件提交到源git存储库。

为了将输出的文件从容器复制到主机的git init路径,我可以使用docker cp命令来获取容器ID和目标路径,在这种情况下,目标路径就是主机的git初始路径。

有人可以分享有关如何获得这两个值的想法吗?

2 个答案:

答案 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/"