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 user / group is 112:116이고 노드 컨테이너의 uid가 1000이므로 노드 프로세스 (노드 사용자 1000으로 실행)는 다음과 같은 작업을 수행 할 수 없습니다 mkdir /.config.

argument를 전달하는 노드 컨테이너를 스핀하려고했는데 -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

로그를 첨부했습니다. 또한 도커 이미지의 jenkins 사용자가 노드 이미지의 노드 사용자와 동일한 uid 인 1000이기 때문에 공식 도커 이미지를 사용하여 Jenkins를 실행하려고 시도했습니다.
Michael

selinux가 활성화되고 적용됩니까?
James Shewey

@JamesShewey 확실하지 않습니다. 나는 단순히 우분투 AMI ec2 인스턴스를 확장합니다.
Michael

나는 그들이 그것을 비활성화한다고 생각하지만 "sestatus"로 확인하십시오. 켜져 있으면 끄십시오.
James Shewey

답변:


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가 소유 한 디렉토리와 파일이 포함되어 있습니다.이 파일은 workpace를 청소 할 때 다음 실행에서 Jenkins 사용자가 삭제할 수 없으므로 sh "sudo chown jenkins: -R \$PWD/" 파이프 라인의 시작 부분에 추가 했습니다.


비슷한 접근 방식을 사용했지만 처음에는 chown 대신 파이프 라인의 "정리"단계로 'sh "chmod -R a + w \ $ PWD"를 실행했습니다. Jenkins 사용자가 내 컨테이너에 정의되어 있지 않아 sudo를 사용할 수 없습니다. 파일도 삭제할 수 있었지만 문제가 발생하면 조사를 위해 보관하는 것이 좋습니다.
Olivier Boudry
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.