¿Cuáles son las configuraciones de permisos correctas cuando se ejecuta Docker en una tubería Jenkins?

11

Estoy tratando de obtener una nueva tubería de jenkins para probar nuevas solicitudes de extracción de nuestro código. Estoy usando docker con la ubuntu:14.04imagen para simular nuestro entorno de producción.

Aquí hay un ejemplo mínimo de trabajo:

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

y

 #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

Y el /etc/sudoersarchivo para el contenedor es el siguiente:

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

El problema que tengo es que Docker no se está ejecutando como root como solía hacerlo y, en cambio, retiene la identificación de usuario del usuario jenkins de la máquina host. Esto hace que sea difícil sudo.

Intenté agregar el usuario jenkins al /etc/passwdarchivo de contenedores y ejecutarlo chmodcontra ese archivo, pero ni siquiera tengo los permisos para hacer ninguno de estos desde el jenkinsfile.

Con esta configuración, debería ser el usuario root. Sin embargo, veo Error: must run as rootsi no uso sudoo sudo: no tty present and no askpass program specifiedsi lo hago.

¿Hay una manera correcta de lidiar con esta situación? Idealmente de la jenkinsfile; Me gustaría evitar crear un adicional Dockerfilesi es posible, ya que esto será un diferenciador adicional entre las pruebas y la producción.

tobasista
fuente
¿Te importaría compartir tu jenkinsfile y unit.sh? Suena principalmente a adivinar en este momento ...
Tensibai
Esta es una especie de pregunta difícil que intenta hacer que las personas resuelvan su tarea. Realmente hay foros de jenkins para ese tipo de cosas. Su pregunta realmente debe formularse de una forma que se pueda encontrar en una búsqueda de Google cuando tenga un problema similar y sea útil para que alguien que no sea usted mismo sea una buena pregunta para este sitio.
Jiri Klouda
He estado buscando esto en Google durante días y he rastreado los documentos de Jenkins. Todavía tengo que encontrar una solución. Si me falta terminología para encontrar las respuestas que necesito, házmelo saber. He actualizado la pregunta para que quede más claro lo que estoy preguntando, pero no estoy de acuerdo con que esto sea 'fibroso' o 'tarea'.
tobassist
He actualizado la pregunta con un ejemplo mínimo
tobassist
1
Tal vez esto pueda ser de ayuda: wiki.jenkins-ci.org/display/JENKINS/Docker+Plugin (creo que -u root cuando no eres root no funciona, cambia el nombre de usuario pero no el userid). Tendrá que preparar su imagen con un usuario de jenkins con permiso para sudo sin contraseña.
Tensibai

Respuestas:

12

Entonces, después de una sesión de depuración en el chat, lo que se necesita es permitir que el usuario que ejecuta jenkins pueda usar sin sudo dockercontraseña en el host del acoplador.

Un archivo sudoers típico en ubuntu podría estar en /etc/sudoers.d/jenkins

jenkins_user ALL=(ALL) NOPASSWD:ALL

Tenga en cuenta que esto permite jenkins_userejecutar como root sin contraseña ningún comando, un mejor archivo debería ser:

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

Esto permitirá iniciar el contenedor como root y, como tal, otorga todos los derechos dentro del contenedor al ejecutarse como uid 0.

Recursos útiles utilizados aparte:

Tensibai
fuente
2

En realidad, es una mala idea ejecutar Docker como root. Lo que debe hacer en cambio es agregar el usuario Jenkins al grupo Docker. sudo usermod -aG docker jenkins. Eso evitará abrir agujeros de seguridad innecesarios y permitirá a Jenkins hacer todo lo que necesita hacer con Docker, incluida la ejecución como raíz dentro de los contenedores. Hago esto regularmente con mis compilaciones, usando esto como muestra:

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
fuente