Каковы правильные настройки разрешений при запуске Docker в трубопроводе Jenkins?

11

Я пытаюсь собрать новый конвейер 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если это возможно, поскольку это будет еще одним отличием между тестированием и производством.

tobassist
источник
Не могли бы вы поделиться своим jenkinsfile и unit.sh? Звучит, в основном, на данный момент ...
Tensibai
Это своего рода трудный вопрос, пытаясь заставить людей решить вашу домашнюю работу. Есть действительно форумы Дженкинса для такого рода вещей. Ваш вопрос должен быть задан в форме, которую можно найти в поиске в Google при наличии аналогичной проблемы, и он будет полезен для кого-то, кроме вас, чтобы он был хорошим вопросом для этого сайта.
Иржи Клауда
Я гуглил это в течение нескольких дней, и я тралял документы Дженкинса. Я еще не нашел решение. Если есть какая-то терминология, которой мне не хватает, чтобы найти нужные мне ответы, пожалуйста, дайте мне знать. Я обновил вопрос, чтобы было понятнее, что я спрашиваю, но я не согласен с тем, что это «неряшливая» или «домашняя работа».
Тобасист
Я обновил вопрос на минимальном примере
тобасист
1
Может быть, это может помочь: wiki.jenkins-ci.org/display/JENKINS/Docker+Plugin (я думаю, что -u root, если вы не root, не работает, он меняет имя пользователя, но не идентификатор пользователя). Вы должны будете подготовить свое изображение с пользователем jenkins, которому разрешено sudo без пароля.
Тенсибай

Ответы:

12

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

Типичный файл sudoers на 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.

Полезные ресурсы, используемые в стороне:

Tensibai
источник
2

На самом деле плохая идея запускать Docker от имени root. Вместо этого вам следует добавить пользователя Jenkins в группу Docker. sudo usermod -aG docker jenkins, Это позволит избежать ненужных дыр в безопасности и позволит 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")
      }
    }
  }
}
primetheus
источник