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

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'
}

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.


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.