詹金斯管道的docker容器内的sudo权限

Kri*_*hna 2 node.js docker jenkins-pipeline

我已经使用声明性语法创建了一个Jenkinsfile来构建我的nodejs应用程序。我曾经使用过docker代理来构建,现在它给了我权限错误。这是我的样本Jenkinsfile。

pipeline {
    agent { 
        docker { 
            image 'node:8.4'
              }
         }   
    stages {
        stage('build') {
            steps {
                    sh 'pwd'
                    sh 'npm --version'
                    sh 'npm --prefix ./Server install'
            }
          }
        }
}

Unhandled rejection Error: EACCES: permission denied, mkdir '/.npm'
Run Code Online (Sandbox Code Playgroud)

我什至尝试添加sudo命令

 sh 'sudo npm --version'
Run Code Online (Sandbox Code Playgroud)

但是然后它给我没有sudo发现的错误。我们如何从Jenkinsfile授予docker内部权限,当前的unix用户是我也已添加到sudoers中的jenkins。当我运行Jenkins文件时,我可以看到它使用-u选项将jenkins用户和组传递给了docker。

 docker run -t -d -u 109:116 -w /var/lib/jenkins/testapp
Run Code Online (Sandbox Code Playgroud)

whi*_*s11 5

问题与npm尝试将其缓存写入/.npm文件夹有关。由于使用-u标志运行容器,因此您运行的用户不是root用户(默认)。在Linux机器上,默认情况下,非root用户无法在/中创建新目录。

您可以选择几种方法来解决问题:

  1. 通过删除-u选项以root用户身份运行容器(这意味着npm将由root用户运行,这可能会导致安全问题)
  2. 将npm缓存路径更改为非特权用户可以在其中写入的文件夹,例如/ tmp
  3. 在创建/.npm目录并向非特权用户授予写权限时,请使用自定义docker映像而不是默认节点之一。

我认为选项2是最简单的,只需在构建脚本中的npm install之前运行以下命令:

export HOME=/tmp ;  npm config set cache /tmp
Run Code Online (Sandbox Code Playgroud)

同样,npm将其配置存储到用户的主目录中。由于您使用的用户不存在于容器中,因此其主目录设置为/。为了避免出现写权限错误,请尝试将HOME env变量也设置为/ tmp。您的安装命令变为:

export HOME=/tmp ;  npm --prefix ./Server install
Run Code Online (Sandbox Code Playgroud)