Próbuję uzyskać nowy potok Jenkinsa, aby przetestować nowe żądania ściągania do naszego kodu. Używam dokera z ubuntu:14.04
obrazem 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/sudoers
plik 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/passwd
pliku kontenerów i uruchamiać się chmod
na 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 root
czy nie używam sudo
lub sudo: no tty present and no askpass program specified
jeśli tak.
Czy istnieje właściwy sposób radzenia sobie z tą sytuacją? Idealnie z jenkinsfile
; Chciałbym uniknąć tworzenia dodatkowego, Dockerfile
jeśli to możliwe, ponieważ będzie to dalsze rozróżnienie między testowaniem a produkcją.
Odpowiedzi:
Tak więc po sesji debugowania na czacie potrzebne jest umożliwienie użytkownikowi uruchamiającemu jenkins możliwość bez
sudo docker
hasła na hoście dokera.Może być w nim typowy plik sudoers na Ubuntu
/etc/sudoers.d/jenkins
Ostrzegam, że pozwala to
jenkins_user
na uruchamianie jako root bez hasła jakiejkolwiek komendy, lepszym plikiem powinien być: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:
sudo
w systemie Linux?źródło
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:źródło