当前位置: 首页 > 面试题库 >

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

翟俊哲
2023-03-14
问题内容

尊敬的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插件,还有另一种简单的方法可以实现我的目标吗?

预先感谢您的时间


问题答案:

正如您在此处或此处所看到的那样,对运行Jenkins的用户的uid和gid进行了硬编码(在您的情况下,是在官方docker映像内创建的Jenkins用户)。

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

已编辑

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

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

这甚至是错误吗?

在这个拉取请求中,似乎他们正在努力。

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

Jenkins随附的新管道插件版本还使用docker-workflow-
plugin运行容器。我不知道另一个插件可以简单地运行它。要解决此问题,您可以以root用户身份运行Jenkins,但这是一个非常丑陋的解决方案。



 类似资料:
  • 本文向大家介绍Docker 常用命令,包括了Docker 常用命令的使用技巧和注意事项,需要的朋友参考一下 查看 容器 提交/导出 镜像 帮助

  • 本文向大家介绍如何免sudo使用docker命令详解,包括了如何免sudo使用docker命令详解的使用技巧和注意事项,需要的朋友参考一下 背景 Docker是PaaS供应商dotCloud开源的一个基于LXC 的高级容器引擎,源代码托管在 GitHub 上, 基于Go语言开发并遵从Apache 2.0协议开源。Docker提供了一种在安全、可重复的环境中自动部署软件的方式,它的出现拉开了基于云计

  • 问题内容: 我面临以下问题:我创建了一个Jenkins Docker容器,并将主机上的Docker套接字与该容器链接。像这样: 然后,当我尝试在詹金斯上创建一些作业时,我收到通常的“权限被拒绝”消息: 尝试在unix:///var/run/docker.sock上连接到Docker守护程序套接字时获得的权限被拒绝:获取 http://%2Fvar%2Frun%2Fdocker.sock/v1.29

  • 问题内容: 我想做这样的事情,我可以依次运行多个命令。 问题答案: 想通了,使用 。 例: 多行中的相同示例: 要么:

  • 我需要用docker exec运行2个命令。我正在从docker容器中复制一个文件,不想处理凭据来使用像ssh这样的东西。此命令复制一个文件: 但它会创建一个子目录var/log,我想避免这种情况,所以如果我可以在docker容器中执行这些操作,我应该很好: 如何让docker exec运行2个命令?

  • 问题内容: 在Unix中,我必须将jenkins用户显式添加到Docker组中,以便可以通过shell步骤运行docker命令。 我找不到有关如何在OS X(mac mini 2012)上实现相同目标的答案。 提前致谢。 问候,维克拉姆 问题答案: 我按照票证中的说明操作了 https://github.com/docker/for-mac/issues/799 Docker文档包含Jenkins