0

我在虚拟机上运行 Jenkins 实例(注意:不在容器中,从现在开始称为“主机”)。在 Jenkins 构建期间,我正在“主机”上启动一个容器(从现在起称为“生成器”),该容器从“主机”安装 docker 套接字。在启动的“Builder”中,我调用 checkout 函数来克隆我的存储库,而不是从 Dockerfile 构建 docker 映像。然后在“主机”的泊坞窗上可以看到生成的图像。然而令我惊讶的是,即使在“Builder”退出后,我在“Builder”中签出的文件也存储在“Host”上的 Jenkins 工作区中。

我不确定为什么会这样。“Builder”的想法是在“Host”和结帐期间下载的任何内容之间进行干净的数据分离 - 在“Builder”关闭之后。

这背后的原因是,然后在“主机”上测试创建的图像,我想确保构建过程中没有残留物,而不必在两者之间推送到工件。

现在:有没有办法将“Builder”和“Host”的存储分开?

编辑

请在下面找到我正在使用的 Jenkins 文件:

node {
  docker.image('ubuntu:17.04').withRun('-v /var/run/docker.sock:/var/run/docker.sock') { c ->
    def checkoutVars = checkout([
      $class: 'GitSCM', 
      branches: [[
        name: '*/master'
      ]],
      doGenerateSubmoduleConfigurations: false, 
      extensions: [], 
      submoduleCfg: [], 
      userRemoteConfigs: [[
        credentialsId: 'credentialsID', 
        url: 'GitHub-URL'
      ]]
    ])
    stage('Build docker image in container') {
      sh "docker build --label build_id=$BUILD_ID --label build_url=$BUILD_URL --label git_commit=" + checkoutVars.GIT_COMMIT + " -t apache2:$BUILD_ID  ."
    }
  }
  stage('Inspect docker image'){
    sh "docker image inspect \$(docker images | awk -vs='2' -ve='2' 'NR>=s&&NR<=e' | awk '{print \$3}')"    
  }
}

编辑1

更换时

docker.image('ubuntu:17.04').withRun('-v /var/run/docker.sock:/var/run/docker.sock') { c ->

和:

docker.image('ubuntu:17.04').inside("--volume=/var/run/docker.sock:/var/run/docker.sock") {

我得到:

/var/lib/jenkins/workspace/PROJECT@tmp/durable-fc0ee627/script.sh: 2: /var/lib/jenkins/workspace/PROJECT@tmp/durable-fc0ee627/script.sh: docker: not found

然而,Git-Repository 仍然被克隆到“主机”上。

4

2 回答 2

1

我决定放弃 Jenkins docker 管道,转而使用本地 docker 突击队。以下命令可以解决问题。注意:在任何情况下都不要使用 git config 部分!

docker run --rm --privileged --name docker-builder \
-v /var/run/docker.sock:/var/run/docker.sock docker:dind \
/bin/sh -c 'apk add --no-cache git && \
git config --global http.sslVerify false \
git clone GIT-URL-GOES-HERE && \
docker build -t IMAGENAME PATH-TO-REPOSITORY/.'
于 2018-02-16T12:07:14.097 回答
0

Jenkins 分配了一个安装到您的容器中的工作区,因此 Jenkins 已经在这样做了。根据您想要的分离程度,您有多种选择:

  1. 使用 ws 语句
  2. 清除工作空间
  3. 使用 skipDefaultCheckout 选项防止自动结帐
于 2018-02-16T10:09:23.127 回答