Jenkins: problema di autorizzazione che utilizza Docker come ambiente di compilazione


11

Ho installato Jenkins su una macchina Ubuntu 16.04. Lo stesso Jenkins non viene eseguito in un contenitore. Quello che voglio fare è semplicemente chiamare yarn installusando un'immagine di nodo. Quindi ecco il mio Jenkinsfile:

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

Abbastanza semplice, vero?

jenkins user / group è 112:116, e l'uid del contenitore del nodo è 1000, quindi il processo di thread (che viene eseguito come utente del nodo 1000) non può fare le sue cose, come mkdir /.config.

Ho provato a girare il contenitore del nodo passando in discussione -u 1000, si è imbattuto in problemi di autorizzazione quando si è cercato di creare directory durevoli.

Sembra l'uno o l'altro tipo di problema, come posso aggirare questo?

Registri di Jenkins:

Di seguito è dove inizia e fallisce la compilazione.

[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

Aggiungi i registri
030

Allegati ai registri. Ho anche provato a eseguire Jenkins usando la sua immagine docker ufficiale, che funziona bene, perché l'utente jenkins nell'immagine docker è 1000, che è lo stesso uid dell'utente nodo nell'immagine nodo.
Michael,

Selinux è abilitato e applicato?
James Shewey,

@JamesShewey Non sono sicuro. Ho semplicemente esteso un'istanza di Ubuntu AMI ec2.
Michael,

Credo che lo disabilitino, ma controlla con "sestatus". Se è acceso, prova a spegnerlo.
James Shewey,

Risposte:


8

Ho avuto lo stesso problema con il nodo. Il fatto è che i file nel contenitore sono di proprietà di "root: root". Prova ad aggiungere args docker -u root:root:

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

La soluzione ha funzionato anche per me. Perché non è presente nella documentazione di Jenkins? (il mio problema era con un semplice pip installcomando risultante Could not install packages due to an EnvironmentError: [Errno 13] Permission denied; menzionandolo qui per aiutare le persone a cercarlo. Anche usando virtualenvo pip install --usernon ho risolto il problema per me)
Rabarberski

3

Ho avuto un problema simile oggi, anche se con un'altra immagine.

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

Riferimento: https://docs.docker.com/storage/tmpfs/ In questo modo non dovresti preoccuparti di eventuali perdite di sicurezza o file presenti dopo la distruzione del contenitore all'interno dei jenkins.


3

buildEnv.inside("-u 0") {}risolto il mio problema. Ma poi l'area di lavoro conterrà directory e file di proprietà di root che non possono essere eliminati dall'utente Jenkins alla prossima esecuzione durante la pulizia dell'area di lavoro, quindi ho aggiunto sh "sudo chown jenkins: -R \$PWD/" all'inizio della pipeline.


Ho usato un approccio simile, ma ho eseguito 'sh "chmod -R a + w \ $ PWD"' alla fine, come un passo "Cleanup" della pipeline anziché chown all'inizio. L'utente Jenkins non è stato definito nel mio contenitore e sudo non era disponibile. Avrei potuto anche eliminare i file, ma ho pensato che sarebbe meglio tenerli per le indagini se qualcosa va storto.
Olivier Boudry
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.