Docker 在 Docker 单独容器存储
Docker in Docker separate container storage
我是运行虚拟机上的一个Jenkins实例(注意:不是在容器里,以后叫"Host")。在 Jenkins 构建期间,我正在 "Host" 上启动一个容器(从现在起称为 "Builder"),它从 "Host" 安装 docker 套接字。在开始的 "Builder" 中,我正在调用 checkout 函数来克隆我的存储库,然后从 Dockerfile 构建一个 docker 图像。然后在 "Host" 的 docker 上可以看到生成的图像。然而令我惊讶的是,即使在 "Builder" 退出后,我在 "Builder" 中签出的文件仍存储在 "Host" 上的 Jenkins 工作区中。
我不确定为什么会这样。 "Builder" 的想法是在 "Host" 和结帐期间下载的任何内容之间有一个干净的数据分离 - 在 "Builder" 关闭之后。
这背后的原因是创建的图像然后在 "Host" 上进行测试,我想确保构建过程中没有残留物,而不必在两者之间推送到人工制品。
现在:有什么方法可以将"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-存储库仍然被克隆到 "Host"。
Jenkins 会分配一个工作区并装载到您的容器中,因此 Jenkins 已经在这样做了。根据您想要的分隔方式,您有多种选择:
我决定放弃 Jenkins docker 管道,转而使用原生 docker 突击队。以下命令可以解决问题。注意:在任何情况下都不要使用 git 配置部分!
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/.'
我是运行虚拟机上的一个Jenkins实例(注意:不是在容器里,以后叫"Host")。在 Jenkins 构建期间,我正在 "Host" 上启动一个容器(从现在起称为 "Builder"),它从 "Host" 安装 docker 套接字。在开始的 "Builder" 中,我正在调用 checkout 函数来克隆我的存储库,然后从 Dockerfile 构建一个 docker 图像。然后在 "Host" 的 docker 上可以看到生成的图像。然而令我惊讶的是,即使在 "Builder" 退出后,我在 "Builder" 中签出的文件仍存储在 "Host" 上的 Jenkins 工作区中。
我不确定为什么会这样。 "Builder" 的想法是在 "Host" 和结帐期间下载的任何内容之间有一个干净的数据分离 - 在 "Builder" 关闭之后。
这背后的原因是创建的图像然后在 "Host" 上进行测试,我想确保构建过程中没有残留物,而不必在两者之间推送到人工制品。
现在:有什么方法可以将"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-存储库仍然被克隆到 "Host"。
Jenkins 会分配一个工作区并装载到您的容器中,因此 Jenkins 已经在这样做了。根据您想要的分隔方式,您有多种选择:
我决定放弃 Jenkins docker 管道,转而使用原生 docker 突击队。以下命令可以解决问题。注意:在任何情况下都不要使用 git 配置部分!
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/.'