Jenkins + Docker:如何在使用Image.inside命令时控制docker用户

亲爱的Stackoverflow社区,

我正在尝试使用docker映像作为我的构build过程的容器来安装Jenkins CIpipe道。 我正在定义一个Jenkinsfile来构build一个构buildpipe道的代码。 我正在做这样的事情:

node { docker.withRegistry('http://my.registry.com', 'docker-credentials') { def buildimage = docker.image('buildimage:latest'); buildimage.pull(); buildimage.inside("") { stage('Checkout sources') { git url: '...', credentialsId: '...' } stage('Run Build and Publish') { sh "..." } } } } 

不幸的是,我磕磕绊绊的Dockerpipe道插件奇怪的行为。 在构build输出中,我可以看到Image.inside(…)命令用a触发容器

 docker run -t -d -u 1000:1000 ... 

这使得我的构build失败,因为在Dockerfile中定义的用户没有UID 1000 …实际上是另一个用户。 我什至试图指定哪个用户应该在Jenkins文件中使用

 node { docker.withRegistry('http://my.registry.com', 'docker-credentials') { def buildimage = docker.image('buildimage:latest'); buildimage.pull(); buildimage.inside("-u otheruser:othergroup") { stage('Checkout sources') { git url: '...', credentialsId: '...' } stage('Run Build and Publish') { sh "..." } } } } 

但是这会导致docker运行命令中出现重复的-u开关

 docker run -t -d -u 1000:1000 -u otheruser:othergroup ... 

显然只有第一个-u被应用,因为我的构build仍然失败。 我也使用whoami进行了debugging,以validation我的假设。

所以我的问题:我如何改变这种行为? 有没有一个开关可以将-u 1000:1000closures? 这甚至是一个错误? 我其实喜欢使用Docker插件,因为它简化了在Jenkins中维护的凭据的自己的Dockerregistry的使用。 但是,如果Docker插件不可用,还有另一个简单的方法来实现我的目标吗?

预先感谢您的时间

正如你在这里或者这里看到的那样,硬编码是追加运行Jenkins的用户的uid和gid(在你的情况下,在官方docker镜像里创build的Jenkins用户)的事实。

您可以更改运行Jenkins映像中的进程的用户,将–user(或-u)parameter passing给docker run命令。 也许这可以减less你的问题。

编辑

我怎样才能改变这种行为? 有没有一个开关可以将-u 1000:1000closures?

您不能在实际版本中更改此行为,因为whoami是硬编码的。

这甚至是一个错误?

在这拉请求似乎他们正在处理它。

但是,如果Docker插件不可用,还有另一个简单的方法来实现我的目标吗?

Jenkins附带的新pipe道插件版本也使用docker-workflow-plugin来运行容器。 我不知道另一个插件以简单的方式运行。 为了解决这个问题,你可以以root身份运行你的Jenkins,但这是一个非常难看的解决scheme。