gpt4 book ai didi

node.js - jenkins 管道的 docker 容器内的 sudo 权限

转载 作者:行者123 更新时间:2023-12-02 15:34:37 29 4
gpt4 key购买 nike

我使用声明性语法创建了一个 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'

我什至尝试添加 sudo 命令

 sh 'sudo npm --version'

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

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

最佳答案

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

您有几种选择来解决您的问题:

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

在我看来,选项 2 是最简单的,只需在构建脚本中的 npm install 之前运行此命令即可:

export HOME=/tmp ;  npm config set cache /tmp

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

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

关于node.js - jenkins 管道的 docker 容器内的 sudo 权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46129443/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com