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

2024-03-23

亲爱的 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 "..."
        }
      }
  }
}

不幸的是,我偶然发现了 Docker 管道插件的奇怪行为。在构建输出中,我可以看到 Image.inside(...) 命令使用

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

这使得我的构建失败,因为 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 "..."
        }
      }
  }
}

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

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

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

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

预先感谢您抽出时间


我发现你实际上可以通过添加来更改用户args喜欢跟随。虽然 -u 1000:1000 仍然存在docker run,您将在 1000:1000 之后附加一个 -u [您的用户]。 Docker实际上会使用最新的-u参数

agent {
  docker {
    image 'your image'
    args '-u root --privileged'
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jenkins + Docker:使用 Image.inside 命令时如何控制 docker 用户 的相关文章

随机推荐