在jenkinspipe道docker容器内的sudo权限

我使用声明性语法创build了一个Jenkinsfile来构build我的nodejs应用程序。 我曾经使用docker代理来构build,现在它给了我许可错误。 这是我的示例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' 

我甚至尝试添加sudo命令

  sh 'sudo npm --version' 

但那么它不会让我发现错误。 我们怎么能从Jenkinsfile里面给Docker里面的权限,当前的unix用户是jenkins,我也添加到了sudoers中。 当我运行jenkins文件,我可以看到它通过jenkins用户和组使用-u选项docker。

  docker run -t -d -u 109:116 -w /var/lib/jenkins/testapp 

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

你有几个select来解决你的问题:

  1. 通过删除-u选项来运行你的容器(这意味着npm将由root用户运行,这可能会导致安全问题)
  2. 将npmcachingpath更改为非特权用户可以写入的文件夹,例如/ tmp
  3. 使用自定义的docker镜像,而不是创build/.npm目录的默认节点,并向非特权用户授予写入权限。

在我看来,选项2是最简单的,只需在构build脚本中安装npm之前运行这个命令即可:

 npm config set cache /tmp 

此外,npm将其configuration存储到用户的主目录中。 由于您正在使用的用户不在容器中,因此他们的主目录设置为/。 为了避免写入权限错误,请尝试将HOME envvariables设置为/ tmp。 你的安装命令变成:

 export HOME=/tmp ; npm --prefix ./Server install 
Interesting Posts