Jenkins Docker插件宿主机克隆文件遇root权限删除失败问题
Jenkins容器内root克隆代码导致宿主机Workspace无法删除的原因
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流水线时,Jenkins因无法删除Workspace抛出Java异常;取消注释sh "chown -R build:build tools/",将容器内root所属的tools目录改为build用户所有后,删除失败的问题不再出现。
核心疑问
Git克隆操作是在my-custom-image容器内执行,未显式使用-v挂载卷,容器内的root用户为何会在宿主机生成root权限文件,导致Jenkins无法删除Workspace?
原因解析
Jenkins的Docker插件在调用image.inside()时,会自动将当前Job的Workspace目录挂载到容器内部,这个挂载是插件默认完成的,不需要手动添加-v参数。
你在容器内以root用户执行git clone,实际上是把代码克隆到了容器挂载的宿主机Workspace目录下。容器内的root用户(UID为0)对应宿主机的root用户,因此克隆生成的文件和目录在宿主机上的属主就是root。
而Jenkins清理Workspace时,是使用自身运行用户(通常是jenkins用户或自定义的build用户)执行删除操作,该用户没有权限删除宿主机上root属主的文件,所以抛出异常。
取消注释chown命令后,将容器内tools目录的属主改为build用户,对应到宿主机上就是把文件属主切换为Jenkins有权操作的用户,自然就能正常删除Workspace了。
内容的提问来源于stack exchange,提问作者RudeusGreyrat
相关产品推荐
相关产品推荐

