我的Jenkinsfile是这样的:
node {
def image = docker.image('my-custom-image')
image.inside("--user=root -e DOCKER_HOST=${env.DOCKER_HOST}") {
stage('Install-tools') {
withCredentials([usernamePassword(credentialsId: 'credentials-id', passwordVariable: 'PASS', usernameVariable: 'USER')]) {
sh "git clone https://$USER:$PASS@myrepo/tools.git"
// sh "chown -R build:build tools/"
}
}
stage('clone') {
checkout scm
}
stage('Deploy') {
sh "python3 -u deployscripts/deploy.py"
}
}
}
字符串
如果我在上面运行它,Jenkins会失败,因为它不能删除工作区(返回一个大的Java异常)。
经过一些搜索,我决定取消注解sh "chown -R build:build tools/"
行。root
拥有的目录tools
现在由build
拥有。我不再得到无法删除工作区错误。
我不明白的是:
我的git clone
在my-custom-image
docker容器中运行。文件只在我的docker镜像中(这里没有使用任何-v
)。用户root
在my-custom-image
中是root。为什么它会在主机上创建root
拥有的文件,阻止Jenkins删除工作区?
1条答案
按热度按时间9gm1akwq1#
为什么它会在主机上创建root所有的文件,阻止Jenkins删除工作区?
因为Jenkins自动将
-u <jenkins_user> -v ${env.WORKSPACE}:somedir -w somedir
添加到image.inside
内部的docker run
参数中。实际上,您正在运行docker run
,但在工作区目录中,这在大多数情况下比它应该的更令人困惑。我发现自己键入docker run
命令更可预测。其他CI/CD系统已经解决了这个问题,通过独占地在容器内工作,如github-actions,或者与其他执行克隆和管理的容器共享工作区目录,如gitlab-cicd。