docker - 在 Docker 容器中添加用户,运行 Jenkins 作业时 UID 不匹配

标签 docker jenkins jenkins-pipeline

我正在 Docker 容器中运行 Jenkins 管道。 Docker 容器创建一个非特权用户来运行:

RUN useradd jenkins --shell /bin/bash --create-home
RUN mkdir -p /home/jenkins/src && chown -R jenkins:jenkins /home/jenkins
USER jenkins
WORKDIR /home/jenkins/src

Jenkins 将其运行为:

docker run -t -d -u 1000:1000 [-v and -e flags etc.]

当我在主机上以我的个人帐户(uid 1000)手动运行 Jenkins 时,此功能有效。但现在我更改了它,以便 Jenkins 由 systemd 自动启动,并使用 uid 1006、gid 1009 的特定 jenkins 用户:

docker run -t -d -u 1006:1009 [-v and -e flags etc.]

这种不匹配导致我的构建失败。我也遇到各种各样的问题,比如容器中的这个提示:

I have no name!@6d3b27a803e4:/$

在容器中创建 jenkins 用户似乎应该有一个配方。 如何使主机和容器上的 UID 匹配?最佳实践是什么?

  • 向 Dockerfile 添加类似 usermod --uid $HOST_UID jenkins 的内容?
  • 似乎没有办法告诉 Docker 将主机 uid 1006 映射到容器 uid 1000,是吗?

最佳答案

在运行 Jenkins 作业时,我遇到了同样的问题,并发现解决方案适合我。 正如您上面所写,如果您在容器中运行作业,Jenkins 会自动启动 Docker,如下所示:

docker run -t -d -u 113:117 [-v and -e flags etc.]

他在本地获取他的 UID 和 GID 并在 Docker run 命令中使用。但是当步骤命令开始在容器中执行时,docker 内部没有这个值。这是造成这个麻烦的原因:

I have no name!@6d3b27a803e4:/$

我的解决方案是在容器内安装“passwd”和“group”文件,如下所示:

pipeline {
    agent {
        docker { 
            image 'your_image' 
            args '-v /etc/passwd:/etc/passwd -v /etc/group:/etc/group'
        }
    }
    
    stages {        
        stage('stage_name') {                
            steps {                
                sh '''
                    some_commands
                '''
            }
        }
    }

并在 Dockerfile 中创建用户,如下所示:

RUN groupadd jenkins && useradd -m -d /var/lib/jenkins -g jenkins -G root jenkins

希望这对某人有帮助)

关于docker - 在 Docker 容器中添加用户,运行 Jenkins 作业时 UID 不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67477059/

相关文章:

docker - 根据分配的标签监控Docker容器

docker - Gitlab Runner:在其他机器上找不到microdnf/yum命令

asp.net - Nginx 无法将 Docker 部署到 Amazon

docker - 如果来自守护进程的错误响应是 : Cannot Kill Container [. ..] 权限被拒绝,如何停止运行容器?

Jenkins 声明性管道使用 When 条件作为分支名称

git - Jenkins:使用来自另一个 repo 的 jenkinsfile 构建多分支管道

java - 在 Jenkins 上运行 TestFX 时如何避免 HeadlessException?

jenkins - Jenkinsfile 中默认情况下可供我使用的可用函数或 API 的列表在哪里?

jenkins - 从 Pipeline 脚本方法获取控制台 Logger(或 TaskListener)

java - 无法运行共享 Groovy 库函数