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.04
imagen 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/sudoers
archivo 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/passwd
archivo de contenedores y ejecutarlo chmod
contra 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 root
si no uso sudo
o sudo: no tty present and no askpass program specified
si lo hago.
¿Hay una manera correcta de lidiar con esta situación? Idealmente de la jenkinsfile
; Me gustaría evitar crear un adicional Dockerfile
si es posible, ya que esto será un diferenciador adicional entre las pruebas y la producción.
Respuestas:
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 docker
contraseña en el host del acoplador.Un archivo sudoers típico en ubuntu podría estar en
/etc/sudoers.d/jenkins
Tenga en cuenta que esto permite
jenkins_user
ejecutar como root sin contraseña ningún comando, un mejor archivo debería ser: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:
sudo
en Linux?fuente
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:fuente