Docker中的Docker独立容器存储

时间:2018-02-15 16:25:00

标签: docker jenkins docker-in-docker

我在虚拟机上运行Jenkins实例(注意:不在容器中,从现在开始称为“Host”)。在Jenkins构建期间,我在“Host”上旋转一个容器(从现在开始称为“Builder”),该容器从“Host”安装docker socket。在启动的“Builder”中,我调用checkout函数来克隆我的存储库,而不是从Dockerfile构建一个docker镜像。然后,在“主机”的泊坞窗上可以看到生成的图像。但令我惊讶的是,我在“Builder”中检出的文件存储在“Host”的Jenkins工作区中,即使在“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}')"    
  }
}

EDIT1

更换时

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仍然被克隆到“主机”上。

2 个答案:

答案 0 :(得分:1)

我决定离开Jenkins码头工具管道并使用原生的docker commandos代替。以下命令可以解决问题。注意:在任何情况下都不要使用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/.'

答案 1 :(得分:0)

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

  1. Using the ws statement
  2. Wiping out the workspace
  3. Using the skipDefaultCheckout option以防止自动结帐