Я пытаюсь собрать новый конвейер jenkins для тестирования новых запросов на извлечение нашего кода. Я использую докер с ubuntu:14.04
изображением для имитации нашей производственной среды.
Вот минимальный рабочий пример:
#jenkinsfile
stage('Checkout and provision'){
docker.image('ubuntu:14.04').withRun('-u root'){
checkout scm
sh 'chmod -R 770 ./'
sh './init-script.sh'
}
}
и
#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
И /etc/sudoers
файл для контейнера выглядит следующим образом:
#
# 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
Проблема, с которой я сталкиваюсь, заключается в том, что docker не работает от имени пользователя root, как я привык, а вместо этого сохраняет идентификатор пользователя jenkins на хост-компьютере. Это затрудняет судо.
Я попытался добавить пользователя jenkins в /etc/passwd
файл контейнеров и запустить его chmod
, но у меня даже нет прав на выполнение одного из них из jenkinsfile
.
С этой конфигурацией я должен быть пользователем root. Тем не менее, я либо вижу, Error: must run as root
если я не использую, sudo
либо sudo: no tty present and no askpass program specified
если я делаю.
Есть ли правильный способ справиться с этой ситуацией? В идеале от jenkinsfile
; Я хотел бы избежать создания дополнительного, Dockerfile
если это возможно, поскольку это будет еще одним отличием между тестированием и производством.
Ответы:
Таким образом, после сеанса отладки в чате необходимо предоставить пользователю, работающему с jenkins, возможность доступа без
sudo docker
пароля на хосте докера.Типичный файл sudoers на Ubuntu может быть в
/etc/sudoers.d/jenkins
Имейте в виду, что это позволяет
jenkins_user
запускать от имени пользователя root без пароля любую команду, лучше файл должен быть:Это позволит запустить контейнер от имени пользователя root и, таким образом, он предоставит все права в самом контейнере, выполнив uid 0.
Полезные ресурсы, используемые в стороне:
sudo
на Linux?источник
На самом деле плохая идея запускать Docker от имени root. Вместо этого вам следует добавить пользователя Jenkins в группу Docker.
sudo usermod -aG docker jenkins
, Это позволит избежать ненужных дыр в безопасности и позволит Jenkins делать все, что нужно с Docker, включая запуск с правами root внутри контейнеров. Я делаю это регулярно со своими сборками, используя это как пример:источник