我在虚拟机上运行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仍然被克隆到“主机”上。
答案 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已经这样做了。根据您想要的分离程度,您有以下几种选择: