Jenkins: Berechtigungsproblem mit Docker als Build-Umgebung

11

Ich habe Jenkins auf einem Ubuntu 16.04-Computer installiert. Der Jenkins selbst wird nicht in einem Container ausgeführt. Ich möchte einfach yarn installmit einem Knotenbild aufrufen . Also hier ist meine Jenkins-Datei:

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

Ziemlich einfach, oder?

Jenkins Benutzer / Gruppe ist 112:116, und die UID des Knotencontainers ist 1000, daher kann der Garnprozess (der als Knotenbenutzer 1000 ausgeführt wird) seine Dinge nicht tun, wie z mkdir /.config.

Ich habe versucht, den als Argument übergebenen -u 1000Knotencontainer hochzufahren. Beim Versuch, dauerhafte Verzeichnisse zu erstellen, sind Berechtigungsprobleme aufgetreten.

Es sieht nach dem einen oder anderen Problem aus. Wie kann ich das umgehen?

Jenkins Protokolle:

Unten beginnt der Build und schlägt fehl.

[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
quelle
Bitte fügen Sie die Protokolle hinzu
030
Hängte die Protokolle an. Ich habe auch versucht, Jenkins mit seinem offiziellen Docker-Image auszuführen, was gut funktioniert, da der Jenkins-Benutzer in diesem Docker-Image 1000 ist, was der gleichen UID entspricht wie der Node-Benutzer im Node-Image.
Michael
Ist Selinux aktiviert und erzwingt es?
James Shewey
@ JamesShewey Nicht sicher. Ich überspanne einfach eine Ubuntu AMI ec2-Instanz.
Michael
Ich glaube, sie deaktivieren es, aber erkundigen Sie sich bei "sestatus". Wenn es eingeschaltet ist, schalten Sie es aus.
James Shewey

Antworten:

8

Ich hatte das gleiche Problem mit Node. Die Sache ist, dass Dateien im Container "root: root" gehören. Versuchen Sie, Docker-Argumente hinzuzufügen -u root:root:

docker { 
    image 'node:8'
    args '-u root:root'
}
Unschärfekatze
quelle
Die Lösung hat auch bei mir funktioniert. Warum steht das nicht in der Jenkins-Dokumentation? (Mein Problem war mit einem einfachen pip installBefehl, der dazu führte Could not install packages due to an EnvironmentError: [Errno 13] Permission denied, dass ich ihn hier erwähnte, um den Leuten bei der Suche zu helfen. Selbst virtualenvpip install --user
wenn
3

Ich hatte heute gerade ein ähnliches Problem, obwohl mit einem anderen Bild.

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

Referenz: https://docs.docker.com/storage/tmpfs/ Auf diese Weise sollten Sie sich keine Sorgen über Sicherheitslecks oder Dateien machen, die vorhanden sind, nachdem der Container in den Jenkins zerstört wurde.

Anvesh
quelle
3

buildEnv.inside("-u 0") {}mein Problem gelöst. Aber dann enthält der Arbeitsbereich ein Verzeichnis und Dateien im Besitz von root, die vom Benutzer Jenkins beim nächsten Ausführen beim Bereinigen des Arbeitsbereichs nicht gelöscht werden können, also habe ich sh "sudo chown jenkins: -R \$PWD/" am Anfang der Pipeline hinzugefügt .

AhmedDrira
quelle
Ich habe einen ähnlichen Ansatz verwendet, aber am Ende 'sh "chmod -R a + w \ $ PWD"' als "Aufräum" -Schritt der Pipeline ausgeführt, anstatt am Anfang chown. Jenkins Benutzer wurde in meinem Container nicht definiert und sudo war nicht verfügbar. Ich hätte die Dateien auch löschen können, dachte aber, es wäre besser, sie zur Untersuchung aufzubewahren, wenn etwas schief geht.
Olivier Boudry