Quels sont les paramètres d'autorisation appropriés lors de l'exécution de Docker dans un pipeline Jenkins?


11

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.04image 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/sudoersfichier 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/passwdfichier conteneurs et d'exécuter chmodce 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 rootsi je n'utilise pas sudoou sudo: no tty present and no askpass program specifiedsi 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 Dockerfilesi possible, car ce sera un autre facteur de différenciation entre les tests et la production.


Voulez-vous partager votre fichier jenkins et votre fichier unit.sh? Sons principalement à deviner à ce stade ...
Tensibai

C'est en quelque sorte une question délicate essayant de faire résoudre vos devoirs aux gens. Il y a vraiment des forums jenkins pour ce genre de chose. Votre question doit vraiment être posée sous une forme qui peut être trouvée dans une recherche Google lorsque vous rencontrez un problème similaire et être utile à quelqu'un d'autre que vous-même pour être une bonne question pour ce site.
Jiri Klouda

Je recherche sur Google depuis des jours et j'ai parcouru les documents Jenkins. Je n'ai pas encore trouvé de solution. S'il y a une terminologie qui me manque pour trouver les réponses dont j'ai besoin, faites-le moi savoir. J'ai mis à jour la question pour clarifier ce que je demande, mais je ne suis pas d'accord pour dire que c'est «filiforme» ou «devoirs».
Tobassist

J'ai mis à jour la question avec un exemple minimal
tobassist

1
Peut-être que cela peut être utile: wiki.jenkins-ci.org/display/JENKINS/Docker+Plugin (je pense que -u root quand vous n'êtes pas root ne fonctionne pas, cela change le nom d'utilisateur mais pas l'ID utilisateur). Vous devrez préparer votre image avec un utilisateur jenkins autorisé à sudo sans mot de passe.
Tensibai

Réponses:


12

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 dockermot de passe sur l'hôte docker.

Un fichier sudoers typique sur ubuntu pourrait être dans /etc/sudoers.d/jenkins

jenkins_user ALL=(ALL) NOPASSWD:ALL

Soyez averti que cela permet jenkins_userd'exécuter en tant que root sans mot de passe aucune commande, un meilleur fichier devrait être:

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

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:


2

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:

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")
      }
    }
  }
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.