Я намагаюся отримати новий трубопровід дженкінса разом, щоб перевірити нові запити на притягнення до нашого коду. Я використовую докер із 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
Проблема, яка у мене виникає, полягає в тому, що докер не працює як root, як я звик, а замість цього зберігає ідентифікатор користувача jenkins користувача з хост-машини. Це ускладнює судо.
Я намагався додати користувача jenkins до /etc/passwd
файлу контейнерів і працює chmod
проти цього файлу, але навіть не маю дозволів робити будь-яке з них із jenkinsfile
.
З цією конфігурацією я повинен бути користувачем root. Однак я бачу, Error: must run as root
чи не користуюся, sudo
чи судо: no tty present and no askpass program specified
якщо так.
Чи є правильний спосіб вирішити цю ситуацію? Ідеально від jenkinsfile
; Я б хотів уникнути створення додаткового, Dockerfile
якщо можливо, це буде подальшим диференціатором між тестуванням та виробництвом.