我正在学习关于Jenkins管道的教程,我可以在节点6.10 docker容器下得到一个“hello world”。
但是,当我在repo中添加一个默认的EmberJS应用程序(使用ember init
)并尝试在管道中构建它时,它在运行npm安装时失败了(因为目录访问问题)。Jenkins档案可以在这里看到:https://github.com/CloudTrap/pipeline-tutorial/blob/fix-build/Jenkinsfile
内部版本打印的错误消息是(它是本地安装的,并在Macbook上使用java -jar jenkins.war
运行,与此无关,但只是为了以防万一):
npm ERR! Linux 4.9.12-moby
npm ERR! argv "/usr/local/bin/node" "/usr/local/bin/npm" "install"
npm ERR! node v6.10.0
npm ERR! npm v3.10.10
npm ERR! path /.npm
npm ERR! code EACCES
npm ERR! errno -13
npm ERR! syscall mkdir
npm ERR! Error: EACCES: permission denied, mkdir '/.npm'
npm ERR! at Error (native)
npm ERR! { Error: EACCES: permission denied, mkdir '/.npm'
npm ERR! at Error (native)
npm ERR! errno: -13,
npm ERR! code: 'EACCES',
npm ERR! syscall: 'mkdir',
npm ERR! path: '/.npm',
npm ERR! parent: 'pipeline-tutorial' }
npm ERR!
npm ERR! Please try running this command again as root/Administrator.
注意:我想不以root/sudo身份运行npm install
。
更新:我已经取得了以下进展:
我从日志中找到了Jenkins使用容器构建的命令:
[Pipeline] withDockerContainer
$ docker run -t -d -u 501:20 -w /long-workspace-directory -v /long-workspace-directory:/long-workspace-directory:rw -v /long-workspace-directory@tmp:/long-workspace-directory@tmp:rw -e
因此,当docker映像运行时,它的工作目录是/long-workspace-directory
(它实际上是一个看起来很神秘的jenkins工作区路径),用户id是501(组id 20),等等。用户没有名称(这显然打破了与此问题无关的其他东西)。
1.将代理更改为使用Dockefile:
agent {
dockerfile {
filename 'Dockerfile'
args '-v /.cache/ -v /.bower/ -v /.config/configstore/'
}
}
1.指定args '-v ...'
以创建npm install/bourer所需目录的卷。
13条答案
按热度按时间hmtdttj41#
添加环境并将主页设置为“.”解决方法如下。
pqwbnv8z2#
来自https://github.com/jenkins-infra/jenkins.io/blob/master/Jenkinsfile
wtzytmuj3#
在这个问题上浪费了一整天的时间,我发现只需在代理阶段使用Pipeline Editor添加以下内容作为环境变量就可以解决这个问题。
lrpiutwd4#
当Jenkins在Docker代理中运行stage时,它通常设置
HOME=/
(图像WORKDIR
值),但Jenkin用户在此目录中没有写入权限,这就是npm
无法创建其缓存目录~/.npm
的原因。要解决此问题,您需要覆盖HOME
或NPM默认缓存目录:8fsztsew5#
我只是想提供更多的细节,简而言之,公认的答案是有效的,但我对Docker还是个新手,我想得到更好的理解,我想分享我的发现。
因此,对于我们的jenkins设置,它通过以下方式启动容器
因此,此容器以用户
uid=995 gid=315 groups=315
身份运行由于我使用的映像(circleci/node:latest)没有具有此UID/GID的用户,因此该用户将没有“主”文件夹,并且只对装入的卷具有权限。
调用NPM命令时,它将尝试使用该用户的主目录(用于缓存),因为该用户不是在映像上创建的,所以主目录被设置为
/
(linux的默认值?)。因此,为了让NPM正常工作,我们只需通过Jenkins文件将用户的容器HOME环境变量指向当前文件夹因此,用户可以在
/folder/forProject/.npm
中创建所需的.npm
文件夹希望这对某人有帮助,如果你看到我有什么错误,请告诉我:D
46scxncf6#
我补充了同样的问题。我使用
root
用户运行Docker映像解决了这个问题:0md85ypi7#
您可以覆盖Jenkins运行docker容器时使用的用户,例如在这里,我使用根用户覆盖(userid:groupid为0:0):
您可以在控制台输出的
docker run
参数中找到当前用户。cnjp1d6j8#
我们有相同的问题,对我们来说,问题的核心是,容器中的用户和运行Jenkins节点的用户具有不同的UID。更改容器中用户的UID+GID(以及更改用户主目录的所有权)以匹配运行构建节点的用户后,npm的行为将正常。
如果容器用户的主目录不可写,也可能发生这种情况。
Dockerfile中的代码:
当工作区装入容器时,它将已经属于UID。当通过Jenkinsfile运行容器时,容器用户的UID和GID会自动设置为匹配buildnode。但主目录仍将拥有其原始所有者。
现在,node_modules将被放置在当前目录中。
oxalkeyp9#
在我的例子中,问题是在容器中,我是用户jenkins,而不是root。我通过在容器内设置
whoami
实现了这一点,得到了类似cannot determine user 111
的错误(它碰巧是jenkins)。因此,我做了以下工作:uyto3xhc10#
这个配置适合我。
eqqqjvef11#
就我而言,这解决了问题
eqfvzcg812#
我正在使用maven构建项目,它实际上正在运行前端maven插件,该插件负责调用npm安装,因此npm安装中断,出现错误:path/。npm npm错误!代码EACCES npm ERR!errno-13 npm错误!系统调用mkdir
我将其更改为npm-install--cache/tmp/empy-cache
而且很管用
jgwigjjp13#
您可以在构建之前动态安装
nvm
,在具有e1d1e的本地目录中,而无需将其设置为全局依赖项:新地点为: