Quali sono le impostazioni di autorizzazione corrette quando si esegue Docker in una pipeline Jenkins?


11

Sto cercando di mettere insieme una nuova pipeline jenkins per testare nuove richieste pull al nostro codice. Sto usando la finestra mobile con l' ubuntu:14.04immagine per simulare il nostro ambiente di produzione.

Ecco un esempio minimo di lavoro:

#jenkinsfile
stage('Checkout and provision'){
docker.image('ubuntu:14.04').withRun('-u root'){
    checkout scm
    sh 'chmod -R 770 ./'
    sh './init-script.sh'
    }
}

e

 #init-script.sh
 sudo add-apt-repository ppa:ondrej/php
 sudo apt-get update -y
 sudo apt-get dist-upgrade -y
 sudo apt-get install \
    apache2 \
    php \
    php-mysql \
    php-xml \
    libapache2-mod-auth-mysql \
    libapache2-mod-php \
    php5-curl \
    zip \
    htop \
    supervisor \
    mailutils \
    git \
    build-essential -y
 sudo apt-get autoremove -y

E il /etc/sudoersfile per il contenitore è il seguente:

#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
Defaults:jenkins !requiretty

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d

jenkins ALL=(ALL:ALL) NOPASSWD:ALL

Il problema che sto riscontrando è che la finestra mobile non funziona come root come sono abituato e invece conserva l'ID utente dell'utente jenkins dal computer host. Questo rende difficile sudo.

Ho provato ad aggiungere l'utente jenkins al /etc/passwdfile container e in esecuzione chmodsu quel file, ma non ho nemmeno le autorizzazioni per fare uno di questi dal jenkinsfile.

Con questa configurazione dovrei essere l'utente root. Tuttavia, vedo Error: must run as rootse non uso sudoo sudo: no tty present and no askpass program specifiedse lo faccio.

Esiste un modo corretto di affrontare questa situazione? Idealmente dal jenkinsfile; Vorrei evitare di crearne uno aggiuntivo, Dockerfilese possibile, poiché ciò costituirà un ulteriore elemento di differenziazione tra test e produzione.


Ti dispiace condividere il tuo file jenkins e unit.sh? A questo punto sembra principalmente un'ipotesi ...
Tensibai,

Questa è una specie di domanda spinosa che cerca di far risolvere i compiti a casa. Ci sono davvero forum jenkins per questo tipo di cose. La tua domanda dovrebbe davvero essere posta in una forma che può essere trovata in una ricerca su Google quando hai problemi simili ed essere utile a qualcuno diverso da te per essere una buona domanda per questo sito.
Jiri Klouda

Ho cercato su Google per giorni e ho trascinato i documenti di Jenkins. Devo ancora trovare una soluzione. Se c'è una terminologia che mi manca per trovare le risposte di cui ho bisogno, per favore fatemelo sapere. Ho aggiornato la domanda per chiarire cosa sto chiedendo, ma non sono d'accordo sul fatto che si tratti di "spinoso" o "compiti a casa".
tabacchista

Ho aggiornato la domanda con un esempio minimo
slittista il

1
Forse questo può essere di aiuto: wiki.jenkins-ci.org/display/JENKINS/Docker+Plugin (penso che -u root quando non sei root non funziona, cambia il nome utente ma non l'ID utente). Dovrai preparare la tua immagine con un utente jenkins autorizzato a sudo senza password.
Tensibai,

Risposte:


12

Quindi, dopo una sessione di debug in chat, è necessario consentire all'utente che esegue jenkins di essere senza sudo dockerpassword sull'host docker.

Potrebbe trovarsi un tipico file sudoers su Ubuntu /etc/sudoers.d/jenkins

jenkins_user ALL=(ALL) NOPASSWD:ALL

Tieni presente che ciò consente jenkins_userdi eseguire come root senza password alcun comando, un file migliore dovrebbe essere:

jenkins_user ALL=(ALL) NOPASSWD:/full/path/to/docker
jenkins_user ALL=(ALL) NOPASSWD:<other needed command to be run as root>

Ciò consentirà di avviare il contenitore come root e come tale fornisce tutti i diritti all'interno del contenitore stesso eseguendo come uid 0.

Risorse utili utilizzate a parte:


2

In realtà è una cattiva idea eseguire Docker come root. Quello che dovresti fare invece è aggiungere l'utente Jenkins al gruppo Docker. sudo usermod -aG docker jenkins. Ciò eviterà l'apertura di inutili falle di sicurezza e consentirà a Jenkins di fare tutto ciò che deve fare con Docker, incluso l'esecuzione come root all'interno dei contenitori. Lo faccio regolarmente con le mie build, usando questo come esempio:

stage ('Build Docker Image') {
  steps {
    script {
      // Build the Docker image for compiling
      dockerImage = docker.build("myapp:v1")
    }
  }
}
stage ('Run UnitTests') {
  steps {
    script {
      dockerImage.inside("-itu root") {
        sh(script: "nosetests app-test.py --verbose")
      }
    }
  }
}
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.