Saya mencoba untuk mendapatkan pipa jenkins baru bersama untuk menguji permintaan tarik baru ke kode kami. Saya menggunakan buruh pelabuhan dengan ubuntu:14.04
gambar untuk mensimulasikan lingkungan produksi kami.
Berikut adalah contoh kerja minimum:
#jenkinsfile
stage('Checkout and provision'){
docker.image('ubuntu:14.04').withRun('-u root'){
checkout scm
sh 'chmod -R 770 ./'
sh './init-script.sh'
}
}
dan
#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
Dan /etc/sudoers
file untuk wadah adalah sebagai berikut:
#
# 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
Masalah yang saya alami adalah bahwa buruh pelabuhan tidak berjalan sebagai root seperti saya terbiasa dan bukannya mempertahankan id pengguna pengguna jenkins dari mesin host. Ini membuat sudo sulit.
Saya sudah mencoba menambahkan pengguna jenkins ke /etc/passwd
file kontainer dan berjalan chmod
melawan file itu tetapi bahkan tidak memiliki izin untuk melakukan salah satu dari ini jenkinsfile
.
Dengan konfigurasi ini saya harus menjadi pengguna root. Namun, saya melihat Error: must run as root
apakah saya tidak menggunakan sudo
atau sudo: no tty present and no askpass program specified
jika saya lakukan.
Apakah ada cara yang tepat untuk menghadapi situasi ini? Idealnya dari jenkinsfile
; Saya ingin menghindari membuat tambahan Dockerfile
jika mungkin karena ini akan menjadi pembeda lebih lanjut antara pengujian dan produksi.
Jawaban:
Jadi setelah sesi debug dalam obrolan apa yang diperlukan adalah untuk memungkinkan pengguna menjalankan jenkins untuk dapat tanpa
sudo docker
kata sandi pada host buruh pelabuhan.File sudoers pada ubuntu biasanya ada di
/etc/sudoers.d/jenkins
Berhati-hatilah, ini memungkinkan
jenkins_user
untuk dijalankan sebagai root tanpa kata sandi perintah apa pun, file yang lebih baik adalah:Ini akan memungkinkan untuk memulai wadah sebagai root dan karena itu memberikan semua hak dalam wadah itu sendiri dengan menjalankan sebagai uid 0.
Sumber daya yang berguna digunakan selain:
sudo
di Linux?sumber
Sebenarnya ide buruk untuk menjalankan Docker sebagai root. Yang harus Anda lakukan adalah menambahkan pengguna Jenkins ke grup Docker.
sudo usermod -aG docker jenkins
. Itu akan menghindari membuka lubang keamanan yang tidak perlu dan memungkinkan Jenkins melakukan semua yang perlu dilakukan dengan Docker, termasuk berjalan sebagai root di dalam wadah. Saya melakukan ini secara teratur dengan bangunan saya, menggunakan ini sebagai sampel:sumber