Jakie są prawidłowe ustawienia uprawnień podczas uruchamiania Dockera na rurociągu Jenkins?

11

Próbuję uzyskać nowy potok Jenkinsa, aby przetestować nowe żądania ściągania do naszego kodu. Używam dokera z ubuntu:14.04obrazem do symulacji naszego środowiska produkcyjnego.

Oto minimalny działający przykład:

#jenkinsfile
stage('Checkout and provision'){
docker.image('ubuntu:14.04').withRun('-u root'){
    checkout scm
    sh 'chmod -R 770 ./'
    sh './init-script.sh'
    }
}

i

 #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

Oraz /etc/sudoersplik do kontenera jest następująca:

#
# 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

Problemem jest to, że okno dokowane nie działa tak samo jak root, a zamiast tego zachowuje identyfikator użytkownika Jenkins z komputera hosta. To utrudnia sudo.

Próbowałem dodać użytkownika jenkins do /etc/passwdpliku kontenerów i uruchamiać się chmodna tym pliku, ale nie mam nawet uprawnień do robienia żadnego z nich z pliku jenkinsfile.

W tej konfiguracji powinienem być użytkownikiem root. Widzę jednak, Error: must run as rootczy nie używam sudolub sudo: no tty present and no askpass program specifiedjeśli tak.

Czy istnieje właściwy sposób radzenia sobie z tą sytuacją? Idealnie z jenkinsfile; Chciałbym uniknąć tworzenia dodatkowego, Dockerfilejeśli to możliwe, ponieważ będzie to dalsze rozróżnienie między testowaniem a produkcją.

tobasista
źródło
Chcesz podzielić się plikiem jenkinsfile i unit.sh? Brzmi głównie jak zgadnąć w tym momencie ...
Tensibai,
To jest trochę trudne pytanie, które zmusza ludzi do rozwiązania twojej pracy domowej. Istnieją naprawdę fora Jenkins na takie rzeczy. Twoje pytanie powinno naprawdę zostać zadane w formie, którą można znaleźć w wyszukiwarce Google, gdy masz podobny problem i być przydatne dla kogoś innego niż ty, aby być dobrym pytaniem dla tej witryny.
Jiri Klouda
Googlowałem od wielu dni i przeglądałem dokumenty Jenkinsa. Jeszcze nie znalazłem rozwiązania. Jeśli brakuje mi terminologii, aby znaleźć odpowiedzi, których potrzebuję, daj mi znać. Zaktualizowałem pytanie, aby wyjaśnić, o co pytam, ale nie zgadzam się, że jest to „rygorystyczne” lub „zadanie domowe”.
tobasysta
Zaktualizowałem pytanie minimalnym przykładem
tobasysta
1
Może to może pomóc: wiki.jenkins-ci.org/display/JENKINS/Docker+Plugin (myślę, że -u root, gdy nie jesteś rootem, nie działa, zmienia nazwę użytkownika, ale nie identyfikator użytkownika). Będziesz musiał przygotować swój obraz z użytkownikiem Jenkins, który może sudo bez hasła.
Tensibai

Odpowiedzi:

12

Tak więc po sesji debugowania na czacie potrzebne jest umożliwienie użytkownikowi uruchamiającemu jenkins możliwość bez sudo dockerhasła na hoście dokera.

Może być w nim typowy plik sudoers na Ubuntu /etc/sudoers.d/jenkins

jenkins_user ALL=(ALL) NOPASSWD:ALL

Ostrzegam, że pozwala to jenkins_userna uruchamianie jako root bez hasła jakiejkolwiek komendy, lepszym plikiem powinien być:

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

Umożliwi to uruchomienie kontenera jako root i jako taki daje wszystkie prawa w samym kontenerze, uruchamiając jako identyfikator UID 0.

Przydatne zasoby wykorzystane na bok:

Tensibai
źródło
2

To naprawdę zły pomysł, aby uruchomić Dockera jako root. Zamiast tego należy dodać użytkownika Jenkins do grupy Docker. sudo usermod -aG docker jenkins. Pozwoli to uniknąć otwierania niepotrzebnych luk w zabezpieczeniach i pozwoli Jenkinsowi zrobić wszystko, co musi zrobić z Dockerem, w tym działać jako root w kontenerach. Robię to regularnie z moimi kompilacjami, wykorzystując to jako przykład:

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
źródło