Jenkins: problem z uprawnieniami przy użyciu Dockera jako środowiska kompilacji

11

Zainstalowałem Jenkinsa na maszynie Ubuntu 16.04. Sam Jenkins nie działa w kontenerze. Chcę po prostu zadzwonić yarn installprzy użyciu obrazu węzła. Oto mój plik Jenkins:

pipeline {
    agent any
    stages {
        stage('install node modules...') {
            agent { docker 'node' }
            steps {
                sh 'cd /path/to/package.json; yarn install'
            }
        }
    }
}

Całkiem proste, prawda?

jenkins użytkownik / grupa jest 112:116, a identyfikator UID kontenera węzła jest 1000, dlatego proces przędzy (który jest uruchamiany jako użytkownik węzła 1000) nie może robić swoich rzeczy, takich jak mkdir /.config.

Próbowałem podkręcić kontener węzła, przekazując argument -u 1000, napotkał on problemy z uprawnieniami podczas próby utworzenia trwałych katalogów.

Wygląda jak jeden lub drugi rodzaj problemu, jak mogę to obejść?

Dzienniki Jenkinsa:

Poniżej znajduje się miejsce, w którym kompilacja rozpoczyna się i kończy niepowodzeniem.

[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
Michael
źródło
Dodaj dzienniki
030
Dołączone dzienniki. Próbowałem także uruchomić Jenkinsa przy użyciu jego oficjalnego obrazu dokera, który działa dobrze, ponieważ użytkownik jenkins na tym obrazie dokera ma wartość 1000, co jest tym samym UID, co użytkownik węzła na obrazie węzła.
Michael
Czy selinux jest włączony i wymusza?
James Shewey,
@JamesShewey Nie jestem pewien. Po prostu rozpakowuję instancję Ubuntu AMI ec2.
Michael
Myślę, że wyłączają to, ale sprawdź za pomocą „sestatus”. Jeśli jest włączony, spróbuj go wyłączyć.
James Shewey,

Odpowiedzi:

8

Miałem ten sam problem z węzłem. Rzecz w tym, że pliki w kontenerze są własnością „root: root”. Spróbuj dodać argumenty dokera -u root:root:

docker { 
    image 'node:8'
    args '-u root:root'
}
blurrcat
źródło
Rozwiązanie również działało dla mnie. Dlaczego nie ma tego w dokumentacji Jenkinsa? (mój problem polegał na prostym pip installpoleceniu skutkującym Could not install packages due to an EnvironmentError: [Errno 13] Permission denied; wzmiankowanie go tutaj, aby pomóc ludziom w szukaniu tego. Nawet używając virtualenvlub pip install --usernie rozwiązując problemu dla mnie)
Rabarberski
3

Właśnie miałem dzisiaj podobny problem, chociaż z innym obrazem.

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

Odniesienie: https://docs.docker.com/storage/tmpfs/ W ten sposób nie powinieneś się martwić o wycieki zabezpieczeń lub pliki, które są obecne po zniszczeniu kontenera w jenkins.

Anvesh
źródło
3

buildEnv.inside("-u 0") {}rozwiązał mój problem. Ale wtedy obszar roboczy będzie zawierał katalog i pliki należące do katalogu głównego, których użytkownik Jenkins nie może usunąć przy następnym uruchomieniu podczas czyszczenia obszaru roboczego, więc dodałem sh "sudo chown jenkins: -R \$PWD/" na początku potoku.

AhmedDrira
źródło
Zastosowałem podobne podejście, ale na końcu uruchomiłem „sh” chmod -R a + w \ $ PWD ”jako krok„ czyszczenia ”potoku zamiast chown na początku. Użytkownik Jenkins nie został zdefiniowany w moim kontenerze, a sudo było niedostępne. Mogłem też usunąć pliki, ale pomyślałem, że lepiej zachować je do zbadania, jeśli coś pójdzie nie tak.
Olivier Boudry