詹金斯&x2B;Docker:使用Image.inside命令时如何控制Docker用户

詹金斯&x2B;Docker:使用Image.inside命令时如何控制Docker用户,docker,jenkins,jenkins-pipeline,Docker,Jenkins,Jenkins Pipeline,亲爱的社区: 我正在尝试使用docker图像作为构建过程的容器来设置Jenkins CI管道。我正在定义一个Jenkins文件,将构建管道作为代码。我正在做这样的事情: node { docker.withRegistry('http://my.registry.com', 'docker-credentials') { def buildimage = docker.image('buildimage:latest'); buildimage.pull()

亲爱的社区:

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

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 "..."
        }
      }
  }
}
不幸的是,我遇到了Docker管道插件的一个奇怪行为。在构建输出中,我可以看到Image.inside(…)命令使用

docker run -t -d -u 1000:1000 ...
这会导致生成失败,因为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 run命令中出现重复的-u开关

docker run -t -d -u 1000:1000 -u otheruser:othergroup ...
显然,只应用了第一个-u,因为我的构建仍然失败。我还使用whoami进行了调试,以验证我的假设

所以我的问题是:我怎样才能改变这种行为?有开关可以关闭-u 1000:1000吗?这是一只虫子吗?我实际上喜欢使用Docker插件,因为它简化了使用Jenkins中维护的凭证的Docker注册表的过程。然而,如果Docker插件不可用,有没有其他简单的方法来实现我的目标

提前感谢您抽出时间

,您可以看到或硬编码了添加运行Jenkins的用户的uid和gid的事实(在您的情况下,是在官方docker映像中创建的Jenkins用户)

通过将--user(或-u)参数传递给
docker run
命令,可以更改在Jenkins映像中运行进程的用户。也许这可以减少你的问题

已编辑

我怎样才能改变这种行为?有开关可以关闭-u 1000:1000吗

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

这是一只虫子吗

在pull请求中,他们似乎正在处理它

然而,如果Docker插件不可用,有没有其他简单的方法来实现我的目标


Jenkins附带的新管道插件版本也使用docker工作流插件来运行容器。我不知道还有什么插件可以用简单的方式运行它。为了解决这个问题,您可以将Jenkins作为root用户运行,但这是一个非常糟糕的解决方案。

我发现您实际上可以通过添加
args
来更改用户,如下所示。虽然-u 1000:1000仍将在
docker运行中出现,但在1000:1000之后,您将增加一个-u[您的用户]。Docker将实际使用最新的-u参数

agent {
  docker {
    image 'your image'
    args '-u root --privileged'
  }
}

对不起,这不能回答我的问题。关于使用-u运行的提示没有帮助,因为它不能像问题中所述那样工作。这段代码是正确的,但是@z0beat的答案也是正确的,它帮助我运行lotrunning
docker start-u 1:1-u 2:2…
在本地执行时设置用户2。但从詹金斯开始,这似乎不起作用。为什么?我和@Datz有同样的问题,我用-u设置了用户,但是没有执行任何操作-u root工作