Ich versuche, eine neue Jenkins-Pipeline zusammenzustellen, um neue Pull-Anforderungen an unseren Code zu testen. Ich verwende Docker mit dem ubuntu:14.04
Image, 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/sudoers
Datei 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/passwd
Datei hinzuzufügen und für chmod
diese 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 root
ob ich nicht benutze sudo
oder sudo: no tty present and no askpass program specified
wenn 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.
Antworten:
Nach einer Debug-Sitzung im Chat muss der Benutzer, der Jenkins ausführt,
sudo docker
auf dem Docker-Host ohne Kennwort arbeiten können.Eine typische Sudoers-Datei auf Ubuntu könnte sich in befinden
/etc/sudoers.d/jenkins
Seien Sie gewarnt, dies erlaubt
jenkins_user
, als root ohne Passwort einen Befehl auszuführen, eine bessere Datei sollte sein: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:
sudo
unter Linux passwortlos einrichten?quelle
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:quelle