挂载卷以在jenkinsfile中共享Docker容器的结果

时间:2019-03-20 12:15:24

标签: docker jenkins-pipeline dockerfile

我的问题是:

我有一个共享文件夹emptyDirVolume(mountPath: '/home', memory: false),

好吧,我正在运行docker文件自动化测试,并且这些测试正在保存到docker容器主目录中的文件夹中。好吧,我想做的就是与容器节点共享该目录,然后使用gsutils将结果上传到另一个容器。

我正在做的是docker run -v /home:/home/tests test,但是节点容器的主目录为空。我在本地测试了dockerfile并且可以正常工作,这可行吗?

我将发布jenkinsfile和dockerfile的代码。

JENKINSFILE:

GString podName = "${name}-${UUID.randomUUID().toString()}"
podTemplate(name: "jnlp",
  label: podName,
  namespace: "jenkins",
  containers: [
    containerTemplate(name: 'node', image: 'gcr.io/xyz', ttyEnabled: true),  
  ],
  volumes: [
    hostPathVolume(mountPath: '/usr/bin/docker', hostPath: '/usr/bin/docker'),
    hostPathVolume(mountPath: '/var/run/docker.sock', hostPath: '/var/run/docker.sock'),
    emptyDirVolume(mountPath: '/home', memory: false),
    secretVolume(secretName: 'kube-jenkins-gcloud-secret', mountPath: '/usr/opt/gcloud/.config')
  ])
  {
    node(podName) {
      //stageWithSlackNotification() {
        stage('build docker image') {
          checkout scm
          container('node') {
            sh "docker build -t test ."
          }
        }

        stage('test') {
          checkout scm  
          container('node') {
            currentBuild.displayName = env.BUILD_NUMBER
            currentBuild.description = env.BUILD_NUMBER

            sh "docker run -v /home:/home/tests test"
          }
        }

         stage('testv2') {
          checkout scm  
          container('node') {

            sh "ls /home"
          }
        }

      //}
    }
  }

DOCKERFILE

FROM gcr.io/xyz

# Create app directory
RUN mkdir -p /usr/opt/hold-ats
WORKDIR /usr/opt/hold-ats

COPY package* ./

RUN npm install

COPY src src

RUN mkdir -p /home/tests

CMD ["./node_modules/.bin/newman", "run", "src/collections/smoke_tests.json", "-e",  "src/environments/dev.json", "--reporter-htmlextra-export", "/home/tests" ,"--reporter-htmlextra-darkTheme", "--reporter-htmlextra-testPaging", "-r", "htmlextra"]

有人知道吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

问题与在由Kubernetes管理的容器内执行jenkins管道阶段时使用docker deamon有关。

使用docker run时,您拥有的docker deamon是主机上的docker deamon,如此处声明的那样:

hostPathVolume(mountPath: '/usr/bin/docker', hostPath: '/usr/bin/docker'),
hostPathVolume(mountPath: '/var/run/docker.sock', hostPath: '/var/run/docker.sock'),

因此,当您使用卷映射-v /home:/home/tests时,将使用主机的目录/home,而不使用kubernetes插件创建的容器的/home目录。

要解决此问题,您可以执行以下两项操作之一:

  1. 在执行管道阶段的kubernetes受管容器内配置其他docker守护进程。
  2. 将同一目录映射为可以同时在docker run和kubernetes容器上访问。

第二种选择似乎更简单,恕我直言,可以通过以下方式实现:

  • 向kubernetes podTemplate添加新的卷映射:hostPathVolume(mountPath: '/home/tests', hostPath: '/tmp/tests'),
  • 运行容器时使用相同的目录:docker run -v /tmp/tests:/home/tests test

玩得开心!