在Jenkins中使用Docker作为构建环境的权限问题

65次阅读
没有评论

问题描述

在Ubuntu 16.04机器上安装了Jenkins,Jenkins本身没有在容器中运行。他想通过使用node镜像来调用yarn install命令。以下是他的Jenkinsfile配置:

pipeline {
    agent any
    stages {
        stage('install node modules...') {
            agent { docker 'node' }
            steps {
                sh 'cd /path/to/package.json; yarn install'
            }
        }
    }
}

但是问题是,Jenkins用户/组为112:116,而node容器的UID为1000,因此yarn进程(以1000用户运行)无法执行一些操作,比如mkdir /.config

解决方案

请注意以下操作可能受版本差异影响,也请在操作前做好备份。

方案1

一个解决方法是在Docker容器中使用-u root:root参数,以确保文件在容器内以”root:root”的所有者拥有权限。你可以在docker部分添加args参数:

docker {
    image 'node:8'
    args '-u root:root'
}

这将允许yarn进程在容器中以root用户运行,从而避免权限问题。然而,这种方法可能会增加安全风险。

方案2

另一种方法是在Docker容器中使用--tmpfs /.config参数,以便在容器内为/.config目录创建一个临时文件系统。这可以通过以下方式实现:

docker {
    image 'node:8'
    args '--tmpfs /.config'
}

这将使/.config目录具有临时文件系统,确保yarn进程可以在其中执行必要的操作。这是一个比较安全的方法,因为临时文件系统会在容器销毁时自动清除。

方案3

如果以上方法不适用,你还可以尝试使用buildEnv.inside来运行构建步骤,并指定-u 0参数,这将使容器在root用户下运行:

pipeline {
    agent any
    stages {
        stage('install node modules...') {
            steps {
                script {
                    buildEnv.inside("-u 0") {
                        sh 'cd /path/to/package.json; yarn install'
                    }
                }
            }
        }
    }
}

然而,注意这种方法可能会引入安全风险,并且需要谨慎使用。

方案4

还有一种方法是在pipeline开始时,使用sh "sudo chown jenkins: -R \$PWD/"来更改工作目录的所有权,以便Jenkins用户可以删除工作目录中的文件:

pipeline {
    agent any
    stages {
        stage('install node modules...') {
            steps {
                sh "sudo chown jenkins: -R \$PWD/"
                sh 'cd /path/to/package.json; yarn install'
            }
        }
    }
}

这将确保在工作目录中的文件具有Jenkins用户的所有权,从而使Jenkins用户可以在之后的运行中删除这些文件。

无论你选择哪种方法,都应该根据你的具体情况进行测试和适当的权限管理。这些解决方案应该能够解决你在Jenkins中使用Docker构建环境时的权限问题。

如果你遇到类似的问题,这些解决方案应该能够帮助你解决问题。请根据你的实际情况选择最合适的解决方案,并根据需要进行适当的测试和安全性评估。

正文完