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

私が抱えている問題は、Dockerが以前のようにrootとして実行されておらず、代わりにホストマシンからのjenkinsユーザーのユーザーIDを保持していることです。これにより、sudoを実行することが難しくなります。

jenkinsユーザーをコンテナー/etc/passwdファイルに追加し、chmodそのファイルに対して実行しようとしましたが、からこれらのいずれかを実行する権限もありませんjenkinsfile

この構成では、私はrootユーザーになる必要があります。ただし、Error: must run as root使用しないsudoか、sudo:使用するかno tty present and no askpass program specifiedを確認します。

この状況に対処する正しい方法はありますか?理想的からjenkinsfile; Dockerfileテストと本番環境をさらに差別化するため、可能であれば追加の作成は避けたいと思います。


jenkinsfileとunit.shを共有することを心に留めてください。この時点で主に推測されるサウンド...
Tensibai

これは、人々にあなたの宿題を解決させようとする厳しい質問のようなものです。そのようなことのために本当にジェンキンスフォーラムがあります。あなたの質問は、同様の問題があるときにグーグル検索で見つけることができるフォームで実際に尋ねられるべきであり、あなた以外の誰かがこのサイトにとって良い質問になるのに役立つでしょう。
Jiri Klouda 2017

私は何日もこれをググググしていて、Jenkinsのドキュメントをトロールしました。まだ解決策を見つけていません。必要な答えを見つけるのに欠けている用語がある場合は、お知らせください。質問の内容を明確にするために質問を更新しましたが、これが「糸引き」または「宿題」であることに同意しません。
tobassist 2017

私は質問を最小限の例で更新しました
tobassist

1
多分これは助けになるかもしれません:wiki.jenkins-ci.org/display/JENKINS/Docker+Plugin(あなたがrootではないときに-u rootが機能しないと思います、それはユーザー名を変更しますがユーザーIDは変更しません)。パスワードなしでsudoを実行できるjenkinsユーザーを使用してイメージを準備する必要があります。
Tensibai 2017

回答:


12

したがって、チャットでのデバッグセッションの後、必要なのは、jenkinsを実行しているユーザーがDocker sudo dockerホストでパスワードなしにできるようにすることです。

ubuntuの一般的なsudoersファイルは次の場所にあります /etc/sudoers.d/jenkins

jenkins_user ALL=(ALL) NOPASSWD:ALL

これによりjenkins_user、パスワードなしでrootとして実行できるようになるので注意してください。コマンドは次のとおりです。

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

これにより、コンテナーをrootとして開始できるようになるため、uid 0として実行することにより、コンテナー自体内のすべての権限が付与されます。

脇で使用される有用なリソース:


2

ルートとしてDockerを実行することは実際には悪い考えです。代わりに、JenkinsユーザーをDockerグループに追加する必要があります。sudo usermod -aG docker jenkins。これにより、不要なセキュリティホールが開かれることがなくなり、Jenkinsがコンテナ内でrootとして実行するなど、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.