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

RoK*_*RoK 21 jenkins docker jenkins-pipeline

亲爱的Stackoverflow社区,

我正在尝试使用docker镜像作为构建过程的容器来设置Jenkins CI管道.我正在定义一个Jenkinsfile以将构建管道作为代码.我正在做这样的事情:

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 "..."
        }
      }
  }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,我绊倒了Docker管道插件的奇怪行为.在构建输出中,我可以看到Image.inside(...)命令用a触发容器

docker run -t -d -u 1000:1000 ...
Run Code Online (Sandbox Code Playgroud)

这使我的构建失败,因为Dockerfile中定义的用户没有UID 1000 ......实际上是另一个用户.我甚至尝试指定应该在Jenkinsfile中使用哪个用户

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 "..."
        }
      }
  }
}
Run Code Online (Sandbox Code Playgroud)

但这会导致生成的docker run命令中出现重复的-u开关

docker run -t -d -u 1000:1000 -u otheruser:othergroup ...
Run Code Online (Sandbox Code Playgroud)

并且显然只应用了第一个-u,因为我的构建仍然失败.我还使用whoami进行调试以验证我的假设.

所以我的问题是:我怎样才能改变这种行为?有一个开关我可以关闭-u 1000:1000吗?这甚至是一个错误吗?我实际上喜欢使用Docker插件,因为它简化了自己的docker注册表在Jenkins中使用的凭据的使用.但是,如果Docker插件不可用,还有另一种简单的方法可以实现我的目标吗?

提前谢谢您的时间

小智 14

我发现您实际上可以通过添加args如下内容来更改用户。尽管-u 1000:1000仍将存在于其中docker run,但在1000:1000之后,您将另外使用-u [您的用户]。Docker将严格使用最新的-u参数

agent {
  docker {
    image 'your image'
    args '-u root --privileged'
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 运行 `docker start -u 1:1 -u 2:2 ...` 在本地执行时设置用户 2。但当开始使用詹金斯时,它似乎不起作用。为什么? (2认同)

z0b*_*eat 10

正如你在这里这里看到的那样硬编码附加运行Jenkins的用户的uid和gid的事实(在你的情况下,在oficial docker图像中创建的Jenkins用户).

您可以更改运行Jenkins映像内的进程的用户,并将--user(或-u)参数传递给该docker run命令.也许这可以最小化你的问题.

编辑

我该如何改变这种行为?有一个开关我可以关闭-u 1000:1000吗?

您无法在实际版本中更改此行为,因为whoami是硬编码的.

这甚至是一个错误吗?

这个拉动请求似乎他们正在努力.

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

Jenkins附带的新管道插件版本也使用docker-workflow-plugin来运行容器.我不知道另一个插件以简单的方式运行它.要解决此问题,您可以以root身份运行Jenkins,但这是一个非常难看的解决方案.

  • 对不起,但这不能回答我的问题。使用 -u 运行的提示没有帮助,因为它不像问题中所述那样工作。 (2认同)