J'essaie de réunir un nouveau pipeline jenkins pour tester de nouvelles demandes d'extraction vers notre code. J'utilise docker avec l' ubuntu:14.04
image pour simuler notre environnement de production.
Voici un exemple de travail minimum:
#jenkinsfile
stage('Checkout and provision'){
docker.image('ubuntu:14.04').withRun('-u root'){
checkout scm
sh 'chmod -R 770 ./'
sh './init-script.sh'
}
}
et
#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
Et le /etc/sudoers
fichier du conteneur est le suivant:
#
# 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
Le problème que je rencontre est que Docker ne fonctionne pas en tant que root comme je le suis et conserve à la place l'ID utilisateur de l'utilisateur jenkins de la machine hôte. Cela rend difficile le sudo.
J'ai essayé d'ajouter l'utilisateur jenkins au /etc/passwd
fichier conteneurs et d'exécuter chmod
ce fichier, mais je n'ai même pas les autorisations pour effectuer l'une ou l'autre de ces opérations depuis le jenkinsfile
.
Avec cette configuration, je devrais être l'utilisateur root. Cependant, je vois Error: must run as root
si je n'utilise pas sudo
ou sudo: no tty present and no askpass program specified
si je le fais.
Existe-t-il une manière correcte de gérer cette situation? Idéalement du jenkinsfile
; J'aimerais éviter d'en créer un Dockerfile
si possible, car ce sera un autre facteur de différenciation entre les tests et la production.
Réponses:
Ainsi, après une session de débogage dans le chat, ce qui est nécessaire est de permettre à l'utilisateur exécutant jenkins de pouvoir se passer de
sudo docker
mot de passe sur l'hôte docker.Un fichier sudoers typique sur ubuntu pourrait être dans
/etc/sudoers.d/jenkins
Soyez averti que cela permet
jenkins_user
d'exécuter en tant que root sans mot de passe aucune commande, un meilleur fichier devrait être:Cela permettra de démarrer le conteneur en tant que root et en tant que tel, il donnera tous les droits dans le conteneur lui-même en s'exécutant en tant que uid 0.
Ressources utiles utilisées à part:
sudo
sur Linux?la source
C'est en fait une mauvaise idée d'exécuter Docker en tant que root. À la place, vous devez ajouter l'utilisateur Jenkins au groupe Docker.
sudo usermod -aG docker jenkins
. Cela évitera d'ouvrir des trous de sécurité inutiles et permettra à Jenkins de faire tout ce qu'il doit faire avec Docker, y compris en tant que root à l'intérieur des conteneurs. Je le fais régulièrement avec mes builds, en utilisant ceci comme exemple:la source