Які правильні налаштування дозволу під час запуску Docker в трубопроводі Дженкінса?


11

Я намагаюся отримати новий трубопровід дженкінса разом, щоб перевірити нові запити на притягнення до нашого коду. Я використовую докер із 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якщо можливо, це буде подальшим диференціатором між тестуванням та виробництвом.


Проти розуму поділитися своїм jenkinsfile та unit.sh? Звучить, головним чином, у цій точці ...
Тенсібай

Це своєрідне важке питання, яке намагається змусити людей вирішувати домашні завдання. Існують справді форуми джинсинів для подібних речей. Ваше питання справді слід задати у формі, яку можна знайти в пошуку Google, коли у вас є подібні проблеми, і бути корисним іншим, крім вас, щоб бути хорошим питанням для цього сайту.
Jiri Klouda

Я цілком гуляв цілими днями і перебирав документи Дженкінса. Я ще повинен знайти рішення. Якщо є термінологія, яку мені не вистачає, щоб знайти потрібні мені відповіді, будь ласка, дайте мені знати. Я оновив це питання, щоб зрозуміти, що я прошу, але я не згоден, що це "важке" або "домашнє завдання".
тобасист

Я оновив питання на мінімальному прикладі
тобасист

1
Можливо, це може допомогти: wiki.jenkins-ci.org/display/JENKINS/Docker+Plugin (Я думаю, що -у root, коли ви не root не працює, він змінює ім'я користувача, але не userid). Вам доведеться підготувати своє зображення з користувачем jenkins, дозволеному користуватися sudo без паролів.
Тенсібай

Відповіді:


12

Отже, після сеансу налагодження в чаті необхідно дозволити користувачеві, що працює за допомогою jenkins, мати можливість без sudo dockerпаролів на хості докера .

Типовий файл судорів на ubuntu міг бути в /etc/sudoers.d/jenkins

jenkins_user ALL=(ALL) NOPASSWD:ALL

Будьте попереджені, це дозволяє jenkins_userзапускати як root без пароля будь-яку команду, кращим файлом має бути:

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

Це дозволить запустити контейнер як root і як такий він надає всі права всередині самого контейнера, запустивши як uid 0.

Корисні ресурси, що використовуються:


2

Насправді погана ідея запустити Docker як root. Замість цього слід додати користувача Jenkins до групи Docker. sudo usermod -aG docker jenkins. Це дозволить уникнути відкриття непотрібних отворів у безпеці та дозволить Дженкінсу зробити все, що потрібно зробити з Docker, включаючи запуск як root всередині контейнерів. Я роблю це регулярно зі своїми побудовами, використовуючи це як зразок:

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")
      }
    }
  }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.