Jenkins:使用Docker作为构建环境的权限问题


11

我在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,节点容器的uid为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

请添加日志
030

附上日志。我还尝试使用其官方docker映像运行Jenkins,它运行良好,因为该docker映像中的jenkins用户为1000,这与node映像中的node用户是相同的uid。
迈克尔

selinux是否已启用并强制执行?
James Shewey

@JamesShewey不确定。我只是跨越了一个ubuntu AMI ec2实例。
迈克尔·迈克尔(Michael

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

Answers:


8

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

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

解决方案也对我有用。为什么Jenkins文档中没有此内容?(我的问题是使用一个简单的pip install命令导致的Could not install packages due to an EnvironmentError: [Errno 13] Permission denied;在这里提到它来帮助人们进行搜索。即使是为我使用virtualenv还是pip install --user未解决该问题)
Rabarberski

3

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

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

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


3

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


我使用了类似的方法,但最后运行了“ sh“ chmod -R a + w \ $ PWD”,作为管道的“清理”步骤,而不是一开始就使用了chown。Jenkins用户未在我的容器中定义,并且sudo不可用。我也可以删除这些文件,但是如果出现问题,最好保留这些文件以进行调查。
奥利维尔·布德里
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.