Docker'ı Jenkins Pipeline'da çalıştırırken doğru izin ayarları nelerdir?


11

Kodumuza yeni çekme isteklerini test etmek için birlikte yeni bir jenkins boru hattı almaya çalışıyorum. ubuntu:14.04Üretim ortamımızı simüle etmek için docker'ı görüntü ile kullanıyorum .

İşte asgari bir çalışma örneği:

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

ve

 #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

Ve /etc/sudoerskonteyner için dosya aşağıdaki gibidir:

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

Sahip olduğum sorun, docker alışık olduğum gibi kök olarak çalışmıyor ve bunun yerine ana makineden jenkins kullanıcının kullanıcı kimliğini tutarak olmasıdır. Bu sudo yapmayı zorlaştırır.

Kapsayıcı /etc/passwddosyasına jenkins kullanıcı ekleme ve chmodbu dosyaya karşı çalışan denedim ama hatta bunlardan birini yapmak için izinleri yok jenkinsfile.

Bu yapılandırma ile kök kullanıcı olmalıyım. Ancak, ya Error: must run as rootben kullanmıyorum sudoya da sudo: no tty present and no askpass program specifiedeğer ben görüyorum.

Bu durumla başa çıkmanın doğru bir yolu var mı? İdeal olarak jenkinsfile; DockerfileTest ve üretim arasında bir başka farklılaştırıcı olacağından, mümkünse ek oluşturmaktan kaçınmak istiyorum .


Jenkinsfile ve unit.sh dosyalarınızı paylaşmak ister misiniz? Sesler çoğunlukla bu noktada tahmin
ediliyor

Bu, insanların ödevlerini çözmelerini sağlamaya çalışan bir tür ip gibi bir sorudur. Bu tür şeyler için gerçekten jenkin forumları var. Sorunuz, benzer bir sorun olduğunda bir Google aramada bulunabilecek bir formda sorulmalı ve bu site için iyi bir soru olması için kendinizden başka biri için yararlı olmalıdır.
Jiri Klouda

Bunu günlerdir araştırıyorum ve Jenkins belgelerini trol ettim. Henüz bir çözüm bulamadım. İhtiyacım olan cevapları bulmak için eksik olduğum bir terminoloji varsa, lütfen bana bildirin. Soruyu sorduğum şeyi daha açık hale getirmek için güncelledim ancak bunun 'telli' veya 'ev ödevi' olduğunu kabul etmiyorum.
tobassist

Soruyu minimal bir örnekle güncelledim
tobassist

1
Belki bu yardımcı olabilir: wiki.jenkins-ci.org/display/JENKINS/Docker+Plugin (Bence root olmadığında -u kök işe yaramaz, kullanıcı adını değiştirmez, kullanıcı kimliğini değiştirir). Görüntünüzü şifresiz sudo yapmasına izin verilen bir jenkins kullanıcısıyla hazırlamanız gerekir.
Tensibai

Yanıtlar:


12

Sohbette bir hata ayıklama oturumundan sonra gerekli olan, jenkins çalışan kullanıcının sudo dockerdocker ana bilgisayarında parolasız yapabilmesini sağlamaktır .

Ubuntu'daki tipik bir sudoers dosyası /etc/sudoers.d/jenkins

jenkins_user ALL=(ALL) NOPASSWD:ALL

Bu jenkins_userkomutun herhangi bir komut olmadan parola olmadan çalıştırılmasına izin verileceği konusunda uyarılmalıdır , daha iyi bir dosya olmalıdır:

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

Bu, kabın kök olarak başlatılmasına izin verir ve bu nedenle uid 0 olarak çalışarak kabın içindeki tüm hakları verir.

Bir kenara kullanılan faydalı kaynaklar:


2

Docker'ı root olarak çalıştırmak aslında kötü bir fikir. Bunun yerine yapmanız gereken Jenkins kullanıcısını Docker grubuna eklemek. sudo usermod -aG docker jenkins. Bu, gereksiz güvenlik deliklerinin açılmasını önleyecek ve Jenkins'in Docker ile yapması gereken her şeyi yapmasına izin verecek, kapların içinde kök olarak çalışacak. Bunu örnek olarak kullanarak yapılarımla düzenli olarak yaparım:

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")
      }
    }
  }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.