Apa pengaturan izin yang benar saat menjalankan Docker di Jenkins Pipeline?


11

Saya mencoba untuk mendapatkan pipa jenkins baru bersama untuk menguji permintaan tarik baru ke kode kami. Saya menggunakan buruh pelabuhan dengan ubuntu:14.04gambar 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/sudoersfile 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/passwdfile kontainer dan berjalan chmodmelawan 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 rootapakah saya tidak menggunakan sudoatau sudo: no tty present and no askpass program specifiedjika saya lakukan.

Apakah ada cara yang tepat untuk menghadapi situasi ini? Idealnya dari jenkinsfile; Saya ingin menghindari membuat tambahan Dockerfilejika mungkin karena ini akan menjadi pembeda lebih lanjut antara pengujian dan produksi.


Pikiran Anda berbagi file jenkins dan unit.sh Anda? Kedengarannya terutama à dugaan pada titik ini ...
Tensibai

Ini semacam pertanyaan sulit yang berusaha membuat orang menyelesaikan pekerjaan rumah Anda. Benar-benar ada forum jenkins untuk hal semacam itu. Pertanyaan Anda harus benar-benar ditanyakan dalam bentuk yang dapat ditemukan dalam pencarian google ketika memiliki masalah yang sama dan berguna bagi orang lain selain diri Anda sendiri untuk menjadi pertanyaan yang bagus untuk situs ini.
Jiri Klouda

Saya sudah googling ini selama berhari-hari dan saya sudah menjelajah dokumen Jenkins. Saya belum menemukan solusinya. Jika ada istilah yang saya lewatkan untuk menemukan jawaban yang saya butuhkan maka tolong beri tahu saya. Saya telah memperbarui pertanyaan untuk memperjelas apa yang saya tanyakan tetapi saya tidak setuju bahwa ini 'ketat' atau 'pekerjaan rumah'.
pelaku tembakau

Saya telah memperbarui pertanyaan dengan contoh minimal
tobassist

1
Mungkin ini bisa membantu: wiki.jenkins-ci.org/display/JENKINS/Docker+Plugin (saya pikir -u root ketika Anda tidak root tidak bekerja, itu mengubah nama pengguna tetapi bukan userid). Anda harus menyiapkan gambar Anda dengan pengguna jenkins diizinkan untuk sudo tanpa kata sandi.
Tensibai

Jawaban:


12

Jadi setelah sesi debug dalam obrolan apa yang diperlukan adalah untuk memungkinkan pengguna menjalankan jenkins untuk dapat tanpa sudo dockerkata sandi pada host buruh pelabuhan.

File sudoers pada ubuntu biasanya ada di /etc/sudoers.d/jenkins

jenkins_user ALL=(ALL) NOPASSWD:ALL

Berhati-hatilah, ini memungkinkan jenkins_useruntuk dijalankan sebagai root tanpa kata sandi perintah apa pun, file yang lebih baik adalah:

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

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:


2

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:

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")
      }
    }
  }
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.