以root身份运行代理docker时,Jenkins Build Pipeline deleteDIR()问题

时间:2018-11-01 18:42:54

标签: docker jenkins jenkins-pipeline

我正在使用docker代理在docker容器内构建我的Jenkins管道,以隔离单元测试。 Jenkins需要以root用户身份运行,以允许其使用顶级docker套接字。我用-v传递Jenkins Slave的docker套接字,并用-u以root身份运行。

构建完成后出现问题。 Jenkins无法在发布步骤中使用deleteDirs()清理工作区,因为运行后所有工作区均由root拥有。

以root用户身份运行Docker代理会更改工作空间权限,因此jenkins无法再运行下一次运行,也不能在最后删除工作空间。一次运行后,如果我不手动从从属节点中删除工作空间,则在其上运行将失败,因为在第二次运行中,它现在无法更改任何文件。因此,我无法清理任何内容,詹金斯无法使用它。另外,我传递的Docker套接字不使用jenkins从节点的用户组,因为ubuntu用户有权运行docker,但是即使将其添加到docker映像中的docker组中,我的代理也正在从中运行当我没有专门以root身份运行Docker代理时,仍然会出现权限问题。

此操作失败,因为docker image neb-base的ubuntu用户无权访问docker套接字。           代理商{             码头工人{                 图片'neb-base:1.0.10'                 args'-u ubuntu -v /var/run/docker.sock:/var/run/docker.sock'                 // -u根             }       }

当我以root身份运行时:           代理商{             码头工人{                 图片'neb-base:1.0.10'                 args'-u root -v /var/run/docker.sock:/var/run/docker.sock'                 // -u根             }       }

这将失败,因为Jenkins节点最后无法清理工作空间,并且在下一次运行时,由于所有权已更改,它将无法访问文件。

关于如何解决此冲突的任何想法?

1 个答案:

答案 0 :(得分:0)

我想对您的管道有更多的了解。但是,下面是我将如何使用docker。使用cloudBees泊坞窗插件,您无需手动安装套接字。插件还负责安装工作区。您需要确保主机上的两个jenkins用户与容器中的用户相同或容器具有root用户。

def image = docker.image(config.dockerImage)
image.pull()
image.inside(dockerOptions) {
sh “mvn -v”
// my other logic 
}