Was sind die richtigen Berechtigungseinstellungen, wenn Docker in einer Jenkins-Pipeline ausgeführt wird?

11

Ich versuche, eine neue Jenkins-Pipeline zusammenzustellen, um neue Pull-Anforderungen an unseren Code zu testen. Ich verwende Docker mit dem ubuntu:14.04Image, um unsere Produktionsumgebung zu simulieren.

Hier ist ein Mindestarbeitsbeispiel:

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

und

 #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

Und die /etc/sudoersDatei für den Container lautet wie folgt:

#
# 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

Das Problem, das ich habe, ist, dass Docker nicht wie gewohnt als Root ausgeführt wird und stattdessen die Benutzer-ID des Jenkins-Benutzers vom Host-Computer beibehält. Dies macht es schwierig zu sudo.

Ich habe versucht, den Benutzer jenkins zur Container- /etc/passwdDatei hinzuzufügen und für chmoddiese Datei auszuführen , habe aber nicht einmal die Berechtigung, eine dieser Aktionen aus dem zu ausführen jenkinsfile.

Mit dieser Konfiguration sollte ich der Root-Benutzer sein. Allerdings sehe ich entweder, Error: must run as rootob ich nicht benutze sudooder sudo: no tty present and no askpass program specifiedwenn ich es tue.

Gibt es einen richtigen Weg, um mit dieser Situation umzugehen? Idealerweise von der jenkinsfile; Ich möchte nach Möglichkeit vermeiden, ein zusätzliches zu erstellen Dockerfile, da dies ein weiteres Unterscheidungsmerkmal zwischen Test und Produktion darstellt.

tobassist
quelle
Möchten Sie Ihre Jenkins-Datei und unit.sh teilen? Klingt an dieser Stelle hauptsächlich nach Vermutung ...
Tensibai
Dies ist eine Art strenge Frage, die versucht, die Leute dazu zu bringen, Ihre Hausaufgaben zu lösen. Es gibt wirklich Jenkins-Foren für solche Dinge. Ihre Frage sollte wirklich in einer Form gestellt werden, die bei ähnlichen Problemen in einer Google-Suche gefunden werden kann und für andere als Sie nützlich ist, um eine gute Frage für diese Website zu sein.
Jiri Klouda
Ich habe das seit Tagen gegoogelt und die Jenkins-Dokumente durchsucht. Ich muss noch eine Lösung finden. Wenn mir eine Terminologie fehlt, um die Antworten zu finden, die ich brauche, lassen Sie es mich bitte wissen. Ich habe die Frage aktualisiert, um klarer zu machen, was ich stelle, aber ich stimme nicht zu, dass dies "fadenziehend" oder "Hausaufgabe" ist.
Tobassist
Ich habe die Frage mit einem minimalen Beispiel aktualisiert
tobassist
1
Vielleicht kann dies hilfreich sein: wiki.jenkins-ci.org/display/JENKINS/Docker+Plugin (Ich denke, -u root, wenn Sie nicht root sind, funktioniert nicht, es ändert den Benutzernamen, aber nicht die Benutzer-ID). Sie müssen Ihr Bild mit einem Jenkins-Benutzer vorbereiten, der ohne Passwort sudo darf.
Tensibai

Antworten:

12

Nach einer Debug-Sitzung im Chat muss der Benutzer, der Jenkins ausführt, sudo dockerauf dem Docker-Host ohne Kennwort arbeiten können.

Eine typische Sudoers-Datei auf Ubuntu könnte sich in befinden /etc/sudoers.d/jenkins

jenkins_user ALL=(ALL) NOPASSWD:ALL

Seien Sie gewarnt, dies erlaubt jenkins_user, als root ohne Passwort einen Befehl auszuführen, eine bessere Datei sollte sein:

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

Auf diese Weise kann der Container als Root gestartet werden, und als solcher werden alle Rechte innerhalb des Containers selbst vergeben, indem er als UID 0 ausgeführt wird.

Nebenbei verwendete nützliche Ressourcen:

Tensibai
quelle
2

Es ist eigentlich eine schlechte Idee, Docker als Root auszuführen. Stattdessen sollten Sie den Jenkins-Benutzer zur Docker-Gruppe hinzufügen. sudo usermod -aG docker jenkins. Dadurch wird vermieden, dass unnötige Sicherheitslücken geöffnet werden, und Jenkins kann alles tun, was mit Docker zu tun hat, einschließlich der Ausführung als Root in den Containern. Ich mache das regelmäßig mit meinen Builds und benutze dies als Beispiel:

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")
      }
    }
  }
}
Primetheus
quelle