Jenkins Pipeline에서 Docker를 실행할 때 올바른 권한 설정은 무엇입니까?


11

코드에 대한 새로운 풀 요청을 테스트하기 위해 새로운 jenkins 파이프 라인을 함께 얻으려고합니다. ubuntu:14.04이미지 와 함께 docker를 사용하여 프로덕션 환경을 시뮬레이션하고 있습니다.

최소 작동 예는 다음과 같습니다.

#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/sudoers컨테이너 의 파일은 다음과 같습니다.

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

내가 겪고있는 문제는도 커가 내가 익숙한 것처럼 루트로 실행되지 않고 대신 호스트 시스템에서 jenkins 사용자의 사용자 ID를 유지한다는 것입니다. 이것은 sudo를 어렵게 만듭니다.

컨테이너 /etc/passwd파일에 jenkins 사용자를 추가하고 chmod해당 파일에 대해 실행 하려고 시도했지만 에서 이들 중 하나를 수행 할 권한이 없습니다 jenkinsfile.

이 구성에서는 루트 사용자 여야합니다. 그러나, 내가 Error: must run as root사용하지 않는지 sudo또는 sudo를 no tty present and no askpass program specified봅니다.

이 상황을 처리하는 올바른 방법이 있습니까? 이상적으로는 jenkinsfile; Dockerfile테스트와 프로덕션의 차별화 요소가 될 수 있으므로 가능 하면 추가 항목을 만드는 것을 피하고 싶습니다 .


jenkinsfile과 unit.sh를 공유 하시겠습니까? 이 시점에서 주로 추측하는 소리 ...
Tensibai

이것은 사람들이 당신의 숙제를 해결하도록하는 일종의 까다로운 질문입니다. 그런 종류의 젠킨스 포럼이 있습니다. 귀하의 질문은 실제로 비슷한 문제가있을 때 Google 검색에서 찾을 수있는 양식으로 요청해야하며이 사이트에 대한 좋은 질문이되기 위해 자신 이외의 다른 사람에게 유용 할 수 있습니다.
Jiri Klouda

나는 이것을 며칠 동안 인터넷 검색을 해왔으며 Jenkins 문서를 트롤했습니다. 아직 해결책을 찾지 못했습니다. 필요한 답변을 찾기 위해 누락 된 용어가 있으면 알려주십시오. 내가 묻는 것을 분명히하기 위해 질문을 업데이트했지만 이것이 '엄격한'또는 '숙제'라는 것에 동의하지 않습니다.
tobassist

나는 최소한의 예제로 질문을 업데이트했습니다
tobassist

1
어쩌면 이것은 도움이 될 수 있습니다 : wiki.jenkins-ci.org/display/JENKINS/Docker+Plugin (루트가 작동하지 않으면 -u root가 작동하지 않으면 사용자 이름은 변경하지만 사용자 ID는 변경하지 않습니다). 젠킨스 사용자가 암호없이 sudo하도록 허용하여 이미지를 준비해야합니다.
Tensibai

답변:


12

따라서 채팅 에서 디버그 세션 후에 jenkins를 실행하는 사용자 sudo docker가 docker 호스트 에서 암호 를 사용할 수 없도록해야 합니다.

우분투의 일반적인 sudoers 파일은 /etc/sudoers.d/jenkins

jenkins_user ALL=(ALL) NOPASSWD:ALL

jenkins_user명령을 사용하면 암호없이 명령을 루트로 실행할 수 있습니다. 더 나은 파일은 다음과 같습니다.

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

이를 통해 컨테이너를 루트로 시작할 수 있으며 uid 0으로 실행하여 컨테이너 자체의 모든 권한을 부여합니다.

유용한 자원들 :


2

Docker를 루트로 실행하는 것은 실제로 나쁜 생각입니다. 대신 Jenkins 사용자를 Docker 그룹에 추가하십시오. sudo usermod -aG docker jenkins. 불필요한 보안 허점을 피하고 Jenkins가 컨테이너 내부의 루트로 실행하는 것을 포함하여 Docker와 관련된 모든 작업을 수행 할 수 있습니다. 샘플로 이것을 사용하여 빌드와 함께 정기적 으로이 작업을 수행합니다.

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")
      }
    }
  }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.