我在Ubuntu 16.04机器上安装了Jenkins。 Jenkins本身不在容器中运行。我要做的只是使用节点图像调用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,很简单,对吗?是1000,因此yarn进程(以节点用户1000的身份运行)无法执行其功能,例如mkdir /.config

我试图通过传递参数-u 1000来启动节点容器,它被许可尝试创建持久目录时出现问题。

看起来像是另一种问题,我该如何解决?

詹金斯日志:

以下是构建开始和失败的地方。

[Pipeline] sh
[Pipeline_Test_Jenkins_test-4JTFYMX7KSJY6ZH44VINNGEB7WH2D2HWYZN5ABF6O32O2HBQJYXQ@2] Running shell script
+ docker inspect -f . node
.
[Pipeline] withDockerContainer
Jenkins does not seem to be running inside a container
$ docker run -t -d -u 112:116 -w /var/lib/jenkins/workspace/Pipeline_Test_Jenkins_test-4JTFYMX7KSJY6ZH44VINNGEB7WH2D2HWYZN5ABF6O32O2HBQJYXQ@2 -v /var/lib/jenkins/workspace/Pipeline_Test_Jenkins_test-4JTFYMX7KSJY6ZH44VINNGEB7WH2D2HWYZN5ABF6O32O2HBQJYXQ@2:/var/lib/jenkins/workspace/Pipeline_Test_Jenkins_test-4JTFYMX7KSJY6ZH44VINNGEB7WH2D2HWYZN5ABF6O32O2HBQJYXQ@2:rw,z -v /var/lib/jenkins/workspace/Pipeline_Test_Jenkins_test-4JTFYMX7KSJY6ZH44VINNGEB7WH2D2HWYZN5ABF6O32O2HBQJYXQ@2@tmp:/var/lib/jenkins/workspace/Pipeline_Test_Jenkins_test-4JTFYMX7KSJY6ZH44VINNGEB7WH2D2HWYZN5ABF6O32O2HBQJYXQ@2@tmp:rw,z -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** --entrypoint cat node
[Pipeline] {
[Pipeline] sh
[Pipeline_Test_Jenkins_test-4JTFYMX7KSJY6ZH44VINNGEB7WH2D2HWYZN5ABF6O32O2HBQJYXQ@2] Running shell script
+ cd /path/to/package.json
+ yarn install
yarn install v0.24.6
error An unexpected error occurred: "EACCES: permission denied, mkdir '/.config'".
info If you think this is a bug, please open a bug report with the information provided in "/var/lib/jenkins/workspace/Pipeline_Test_Jenkins_test-4JTFYMX7KSJY6ZH44VINNGEB7WH2D2HWYZN5ABF6O32O2HBQJYXQ@2/<path>/yarn-error.log".
info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.
[Pipeline] }
$ docker stop --time=1 c1147934ea689f71a449e486282db03338b12182368def31bdf8e8cf179ab46a
$ docker rm -f c1147934ea689f71a449e486282db03338b12182368def31bdf8e8cf179ab46a
[Pipeline] // withDockerContainer
[Pipeline] }
[Pipeline] // node
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
ERROR: script returned exit code 1
Finished: FAILURE

评论

请添加日志

附上日志。我还尝试使用其正式的docker镜像运行Jenkins,效果很好,因为该docker镜像中的jenkins用户为1000,这与node image中的node用户是相同的uid。
selinux是否已启用并强制执行?

@JamesShewey不确定。我只是跨越了一个ubuntu AMI ec2实例。

我相信他们会禁用它,但是请检查“ sestatus”。如果已打开,请尝试将其关闭。

#1 楼

我对节点有同样的问题。问题是容器中的文件归“ root:root”所有。尝试添加docker args -u root:root

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


评论


解决方案也对我有用。为什么Jenkins文档中没有此内容? (我的问题是一个简单的pip install命令,由于EnvironmentError而导致无法安装软件包:[Errno 13]权限被拒绝;在此处提及以帮助人们进行搜索。即使使用virtualenv或pip install --user也没有为我解决问题)

– Rabarberski
19-6-25在8:38



关于pip install --user。您可能没有以-u 112:116身份访问工作区目录的权限。您可能没有任何权限。图像中甚至不存在ID为112的用户和ID为116的组。

–user7610
20年8月4日在10:44



#2 楼

我今天有一个类似的问题,尽管有另一个图像。

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


参考:https://docs.docker.com/storage/tmpfs/
这样,您不必担心任何安全漏洞或容器在詹金斯内部销毁后存在的文件。

#3 楼

buildEnv.inside("-u 0") {}解决了我的问题。但是随后,工作空间将包含root拥有的目录和文件,Jenkins在清理工作区时无法在下次运行时删除它们,因此我在管道的开头添加了sh "sudo chown jenkins: -R $PWD/"

评论


我使用了类似的方法,但最后运行了“ sh“ chmod -R a + w \ $ PWD”,作为管道的“清理”步骤,而不是一开始就使用了chown。 Jenkins用户未在我的容器中定义,并且sudo不可用。我也可以删除这些文件,但是如果出现问题,最好保留这些文件以进行调查。

–奥利维尔·布德里(Olivier Boudry)
19年5月8日在14:25