Các cài đặt quyền chính xác khi chạy Docker trong Đường ống Jenkins là gì?


11

Tôi đang cố gắng để có được một đường ống jenkins mới cùng nhau để kiểm tra các yêu cầu kéo mới tới mã của chúng tôi. Tôi đang sử dụng docker với ubuntu:14.04hình ảnh để mô phỏng môi trường sản xuất của chúng tôi.

Dưới đây là một ví dụ làm việc tối thiểu:

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

 #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

/etc/sudoerstập tin cho container như sau:

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

Vấn đề tôi gặp phải là docker không chạy bằng root như tôi đã sử dụng và thay vào đó giữ lại id người dùng của người dùng jenkins từ máy chủ. Điều này làm cho nó khó khăn để sudo.

Tôi đã thử thêm người dùng jenkins vào /etc/passwdtệp container và chạy chmodvới tệp đó nhưng thậm chí không có quyền để thực hiện một trong hai điều này từ jenkinsfile.

Với cấu hình này, tôi sẽ là người dùng root. Tuy nhiên, tôi sẽ xem Error: must run as rootnếu tôi không sử dụng sudohoặc sudo: no tty present and no askpass program specifiednếu tôi làm.

Có một cách chính xác để đối phó với tình huống này? Lý tưởng từ jenkinsfile; Tôi muốn tránh tạo thêm Dockerfilenếu có thể vì đây sẽ là một điểm khác biệt hơn nữa giữa thử nghiệm và sản xuất.


Tâm trí chia sẻ jenkinsfile và unit.sh của bạn? Âm thanh chủ yếu là đoán vào thời điểm này ...
Tensibai

Đây là một loại câu hỏi khó để cố gắng làm cho mọi người giải bài tập về nhà của bạn. Có những diễn đàn jenkins thực sự cho loại điều đó. Câu hỏi của bạn nên thực sự được hỏi trong một hình thức có thể tìm thấy trong một tìm kiếm google khi gặp vấn đề tương tự và hữu ích cho một ai đó không phải là chính bạn để trở thành một câu hỏi hay cho trang web này.
Jiri Klouda

Tôi đã googling điều này trong nhiều ngày và tôi đã tìm ra tài liệu của Jenkins. Tôi vẫn chưa tìm ra giải pháp. Nếu có thuật ngữ mà tôi đang thiếu để tìm câu trả lời tôi cần thì xin vui lòng cho tôi biết. Tôi đã cập nhật câu hỏi để làm rõ hơn những gì tôi đang hỏi nhưng tôi không đồng ý rằng đây là 'chuỗi' hoặc 'bài tập về nhà'.
xe đạp

Tôi đã cập nhật câu hỏi với một ví dụ tối thiểu
dõi

1
Có lẽ điều này có thể giúp ích: wiki.jenkins-ci.org/display/JENKINS/Docker+Plugin (Tôi nghĩ rằng -u root khi bạn không root không hoạt động, nó thay đổi tên người dùng nhưng không phải là userid). Bạn sẽ phải chuẩn bị hình ảnh của mình với người dùng jenkins được phép không mật khẩu.
Tensibai

Câu trả lời:


12

Vì vậy, sau một phiên gỡ lỗi trong trò chuyện, điều cần thiết là cho phép người dùng chạy jenkins có thể không sudo dockermật khẩu trên máy chủ docker.

Một tập tin sudoers điển hình trên Ubuntu có thể có trong /etc/sudoers.d/jenkins

jenkins_user ALL=(ALL) NOPASSWD:ALL

Được cảnh báo điều này cho phép jenkins_userchạy bằng root mà không cần mật khẩu bất kỳ lệnh nào, một tệp tốt hơn nên là:

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

Điều này sẽ cho phép khởi động container với quyền root và do đó nó cung cấp tất cả các quyền trong chính container bằng cách chạy dưới dạng 0.

Tài nguyên hữu ích được sử dụng sang một bên:


2

Đó thực sự là một ý tưởng tồi để chạy Docker với quyền root. Thay vào đó, những gì bạn nên làm là thêm người dùng Jenkins vào nhóm Docker. sudo usermod -aG docker jenkins. Điều đó sẽ tránh mở các lỗ hổng bảo mật không cần thiết và cho phép Jenkins làm tất cả những gì cần làm với Docker, bao gồm cả việc chạy như root bên trong các container. Tôi làm điều này thường xuyên với các bản dựng của mình, sử dụng mẫu này làm mẫu:

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")
      }
    }
  }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.